diff --git a/easy_profiler_core/CMakeLists.txt b/easy_profiler_core/CMakeLists.txt index 65ddceb8..8cf363e7 100644 --- a/easy_profiler_core/CMakeLists.txt +++ b/easy_profiler_core/CMakeLists.txt @@ -47,6 +47,7 @@ if (WIN32) set(EASY_OPTION_IMPLICIT_THREAD_REGISTRATION ON CACHE BOOL ${EASY_OPTION_IMPLICIT_THREAD_REGISTER_TEXT}) set(EASY_OPTION_EVENT_TRACING ON CACHE BOOL "Enable event tracing by default") set(EASY_OPTION_LOW_PRIORITY_EVENT_TRACING ON CACHE BOOL "Set low priority for event tracing thread") + set(EASY_OPTION_THREAD_SAFE_INIT ON CACHE BOOL "Should be turn off if thread-safe initialization of static local variables is disabled (see visual studio's /Zc:threadSafeInit- compiler option for details).") else () if (NO_CXX11_THREAD_LOCAL_SUPPORT) set(EASY_OPTION_IMPLICIT_THREAD_REGISTRATION OFF CACHE BOOL ${EASY_OPTION_IMPLICIT_THREAD_REGISTER_TEXT}) @@ -62,6 +63,21 @@ set(BUILD_WITH_CHRONO_HIGH_RESOLUTION_CLOCK OFF CACHE BOOL "Use std::chrono::hig +##################################################################### +# Generate config header: +if (${EASY_OPTION_THREAD_SAFE_INIT}) + set(EASY_DISABLE_THREAD_SAFE_INIT 0) +else () + set(EASY_DISABLE_THREAD_SAFE_INIT 1) +endif () + +configure_file ( + "${CMAKE_CURRENT_SOURCE_DIR}/include/easy/details/profiler_config.h.in" + "${CMAKE_CURRENT_SOURCE_DIR}/include/easy/details/profiler_config.h" +) + + + ##################################################################### # Print EasyProfiler options status: message(STATUS "-------- EASY_PROFILER OPTIONS: --------") @@ -156,6 +172,7 @@ set(INCLUDE_FILES ${EASY_INCLUDE_DIR}/details/profiler_aux.h ${EASY_INCLUDE_DIR}/details/profiler_colors.h ${EASY_INCLUDE_DIR}/details/profiler_public_types.h + ${EASY_INCLUDE_DIR}/details/profiler_config.h ) source_group(include FILES ${INCLUDE_FILES}) diff --git a/easy_profiler_core/include/easy/details/easy_compiler_support.h b/easy_profiler_core/include/easy/details/easy_compiler_support.h index 212359db..c7a04c7f 100644 --- a/easy_profiler_core/include/easy/details/easy_compiler_support.h +++ b/easy_profiler_core/include/easy/details/easy_compiler_support.h @@ -53,6 +53,8 @@ #include +#include + #if defined(_WIN32) && !defined(EASY_PROFILER_STATIC) // Visual Studio and MinGW # ifdef _BUILD_PROFILER @@ -191,8 +193,13 @@ static_assert(false, "EasyProfiler is not configured for using your compiler typ #endif #ifndef EASY_LOCAL_STATIC_PTR -# define EASY_LOCAL_STATIC_PTR(VarType, VarName, VarInitializer) static VarType VarName = VarInitializer -# define EASY_MAGIC_STATIC_AVAILABLE +# if defined(_MSC_VER) && EASY_DISABLE_THREAD_SAFE_INIT != 0 +# define EASY_LOCAL_STATIC_PTR(VarType, VarName, VarInitializer) thread_local static VarType VarName = VarInitializer +# define EASY_MAGIC_STATIC_AVAILABLE +# else +# define EASY_LOCAL_STATIC_PTR(VarType, VarName, VarInitializer) static VarType VarName = VarInitializer +# define EASY_MAGIC_STATIC_AVAILABLE +# endif #endif #ifndef EASY_FINAL diff --git a/easy_profiler_core/include/easy/details/profiler_config.h.in b/easy_profiler_core/include/easy/details/profiler_config.h.in new file mode 100644 index 00000000..55652b70 --- /dev/null +++ b/easy_profiler_core/include/easy/details/profiler_config.h.in @@ -0,0 +1,62 @@ +/************************************************************************ +* file name : profiler_aux.h +* ----------------- : +* creation time : 2016/06/11 +* author : Victor Zarubkin +* email : v.s.zarubkin@gmail.com +* ----------------- : +* description : This file contains auxiliary profiler macros and funcitons. +* ----------------- : +* change log : * 2016/06/11 Victor Zarubkin: Moved sources from profiler.h +* : +* : * +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2018 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +// THIS IS GENERATED FILE. PLEASE DON'T EDIT // + +#ifndef EASY_PROFILER_CONFIG_H +#define EASY_PROFILER_CONFIG_H + +#define EASY_DISABLE_THREAD_SAFE_INIT @EASY_DISABLE_THREAD_SAFE_INIT@ + +#endif // EASY_PROFILER_CONFIG_H diff --git a/easy_profiler_core/include/easy/profiler.h b/easy_profiler_core/include/easy/profiler.h index b9f7b572..e61ed186 100644 --- a/easy_profiler_core/include/easy/profiler.h +++ b/easy_profiler_core/include/easy/profiler.h @@ -360,7 +360,6 @@ You don't need to rebuild or restart your application for that. # define EASY_OPTION_LOW_PRIORITY_EVENT_TRACING true # endif - /** If != 0 then EasyProfiler will print error messages into stderr. Otherwise, no log messages will be printed.