From 3ee2067d7256975dedefd0e3fd41753447f8beb7 Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 2 Oct 2018 19:31:39 +0300 Subject: [PATCH 1/5] Use thread_local instead of static in EASY_LOCAL_STATIC_PTR. As without it it's impossible to profile functions called from multiple threads. --- easy_profiler_core/include/easy/details/easy_compiler_support.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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..1b230e07 100644 --- a/easy_profiler_core/include/easy/details/easy_compiler_support.h +++ b/easy_profiler_core/include/easy/details/easy_compiler_support.h @@ -191,7 +191,7 @@ 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_LOCAL_STATIC_PTR(VarType, VarName, VarInitializer) thread_local VarType VarName = VarInitializer # define EASY_MAGIC_STATIC_AVAILABLE #endif From 3759ed628ac97a0e1ebe508e592595e3b54ab54a Mon Sep 17 00:00:00 2001 From: evgeny Date: Thu, 4 Oct 2018 21:18:14 +0300 Subject: [PATCH 2/5] Revert "Use thread_local instead of static in EASY_LOCAL_STATIC_PTR. As without it it's impossible to profile functions called from multiple threads." This reverts commit 3ee2067d7256975dedefd0e3fd41753447f8beb7. --- easy_profiler_core/include/easy/details/easy_compiler_support.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 1b230e07..212359db 100644 --- a/easy_profiler_core/include/easy/details/easy_compiler_support.h +++ b/easy_profiler_core/include/easy/details/easy_compiler_support.h @@ -191,7 +191,7 @@ 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) thread_local VarType VarName = VarInitializer +# define EASY_LOCAL_STATIC_PTR(VarType, VarName, VarInitializer) static VarType VarName = VarInitializer # define EASY_MAGIC_STATIC_AVAILABLE #endif From 7c112646e94f6badb96a0b531ab9eb0ed21e7ade Mon Sep 17 00:00:00 2001 From: evgeny Date: Fri, 5 Oct 2018 17:33:23 +0300 Subject: [PATCH 3/5] Added option EASY_OPTION_THREAD_SAFE_INIT to support disabled thread-safe initialization of static local variables. --- easy_profiler_core/CMakeLists.txt | 2 ++ .../include/easy/details/easy_compiler_support.h | 8 ++++++-- easy_profiler_core/include/easy/profiler.h | 15 +++++++++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/easy_profiler_core/CMakeLists.txt b/easy_profiler_core/CMakeLists.txt index 65ddceb8..f51419b4 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 OFF 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). Note: if disabled it also has to be defined in project using profiler.") else () if (NO_CXX11_THREAD_LOCAL_SUPPORT) set(EASY_OPTION_IMPLICIT_THREAD_REGISTRATION OFF CACHE BOOL ${EASY_OPTION_IMPLICIT_THREAD_REGISTER_TEXT}) @@ -204,6 +205,7 @@ easy_define_target_option(easy_profiler EASY_OPTION_IMPLICIT_THREAD_REGISTRATION if (WIN32) easy_define_target_option(easy_profiler EASY_OPTION_EVENT_TRACING EASY_OPTION_EVENT_TRACING_ENABLED) easy_define_target_option(easy_profiler EASY_OPTION_LOW_PRIORITY_EVENT_TRACING EASY_OPTION_LOW_PRIORITY_EVENT_TRACING) + easy_define_target_option(easy_profiler EASY_OPTION_THREAD_SAFE_INIT EASY_OPTION_THREAD_SAFE_INIT) else () easy_define_target_option(easy_profiler EASY_OPTION_REMOVE_EMPTY_UNGUARDED_THREADS EASY_OPTION_REMOVE_EMPTY_UNGUARDED_THREADS) endif () 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..69343cce 100644 --- a/easy_profiler_core/include/easy/details/easy_compiler_support.h +++ b/easy_profiler_core/include/easy/details/easy_compiler_support.h @@ -191,8 +191,12 @@ 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_OPTION_THREAD_SAFE_INIT == 0 +# define EASY_LOCAL_STATIC_PTR(VarType, VarName, VarInitializer) thread_local static VarType VarName = VarInitializer +# 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/profiler.h b/easy_profiler_core/include/easy/profiler.h index b9f7b572..d0749bdd 100644 --- a/easy_profiler_core/include/easy/profiler.h +++ b/easy_profiler_core/include/easy/profiler.h @@ -360,6 +360,17 @@ You don't need to rebuild or restart your application for that. # define EASY_OPTION_LOW_PRIORITY_EVENT_TRACING true # endif +/** If false then static . + + +\note It takes effect only on MS Visual Studio. + +\ingroup profiler +*/ +# ifndef EASY_OPTION_THREAD_SAFE_INIT +# define EASY_OPTION_THREAD_SAFE_INIT 1 +# endif + /** If != 0 then EasyProfiler will print error messages into stderr. Otherwise, no log messages will be printed. @@ -412,6 +423,10 @@ Otherwise, no log messages will be printed. # define EASY_OPTION_LOW_PRIORITY_EVENT_TRACING true # endif +# ifndef EASY_OPTION_THREAD_SAFE_INIT +# define EASY_OPTION_THREAD_SAFE_INIT 1 +# endif + # ifndef EASY_OPTION_LOG_ENABLED # define EASY_OPTION_LOG_ENABLED 0 # endif From cddba4e44360d1ae90ed757e123110a2e291e368 Mon Sep 17 00:00:00 2001 From: evgeny Date: Fri, 5 Oct 2018 18:10:21 +0300 Subject: [PATCH 4/5] Added generation of config header to avoid setting some defines also in project using profiler. EASY_OPTION_THREAD_SAFE_INIT doesn't require setting it in project using profiler. --- easy_profiler_core/CMakeLists.txt | 19 +++++- .../easy/details/easy_compiler_support.h | 4 +- .../include/easy/details/profiler_config.h.in | 62 +++++++++++++++++++ easy_profiler_core/include/easy/profiler.h | 16 ----- 4 files changed, 82 insertions(+), 19 deletions(-) create mode 100644 easy_profiler_core/include/easy/details/profiler_config.h.in diff --git a/easy_profiler_core/CMakeLists.txt b/easy_profiler_core/CMakeLists.txt index f51419b4..8cf363e7 100644 --- a/easy_profiler_core/CMakeLists.txt +++ b/easy_profiler_core/CMakeLists.txt @@ -47,7 +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 OFF 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). Note: if disabled it also has to be defined in project using profiler.") + 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}) @@ -63,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: --------") @@ -157,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}) @@ -205,7 +221,6 @@ easy_define_target_option(easy_profiler EASY_OPTION_IMPLICIT_THREAD_REGISTRATION if (WIN32) easy_define_target_option(easy_profiler EASY_OPTION_EVENT_TRACING EASY_OPTION_EVENT_TRACING_ENABLED) easy_define_target_option(easy_profiler EASY_OPTION_LOW_PRIORITY_EVENT_TRACING EASY_OPTION_LOW_PRIORITY_EVENT_TRACING) - easy_define_target_option(easy_profiler EASY_OPTION_THREAD_SAFE_INIT EASY_OPTION_THREAD_SAFE_INIT) else () easy_define_target_option(easy_profiler EASY_OPTION_REMOVE_EMPTY_UNGUARDED_THREADS EASY_OPTION_REMOVE_EMPTY_UNGUARDED_THREADS) endif () 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 69343cce..c8cff73e 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,7 +193,7 @@ static_assert(false, "EasyProfiler is not configured for using your compiler typ #endif #ifndef EASY_LOCAL_STATIC_PTR -# if defined(_MSC_VER) && EASY_OPTION_THREAD_SAFE_INIT == 0 +# if defined(_MSC_VER) && EASY_DISABLE_THREAD_SAFE_INIT != 0 # define EASY_LOCAL_STATIC_PTR(VarType, VarName, VarInitializer) thread_local static VarType VarName = VarInitializer # else # define EASY_LOCAL_STATIC_PTR(VarType, VarName, VarInitializer) static VarType VarName = VarInitializer 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 d0749bdd..e61ed186 100644 --- a/easy_profiler_core/include/easy/profiler.h +++ b/easy_profiler_core/include/easy/profiler.h @@ -360,18 +360,6 @@ You don't need to rebuild or restart your application for that. # define EASY_OPTION_LOW_PRIORITY_EVENT_TRACING true # endif -/** If false then static . - - -\note It takes effect only on MS Visual Studio. - -\ingroup profiler -*/ -# ifndef EASY_OPTION_THREAD_SAFE_INIT -# define EASY_OPTION_THREAD_SAFE_INIT 1 -# endif - - /** If != 0 then EasyProfiler will print error messages into stderr. Otherwise, no log messages will be printed. @@ -423,10 +411,6 @@ Otherwise, no log messages will be printed. # define EASY_OPTION_LOW_PRIORITY_EVENT_TRACING true # endif -# ifndef EASY_OPTION_THREAD_SAFE_INIT -# define EASY_OPTION_THREAD_SAFE_INIT 1 -# endif - # ifndef EASY_OPTION_LOG_ENABLED # define EASY_OPTION_LOG_ENABLED 0 # endif From f86b817fbb2c6b7c0820d62552d1e6a3ac13ff69 Mon Sep 17 00:00:00 2001 From: evgeny Date: Fri, 5 Oct 2018 19:13:03 +0300 Subject: [PATCH 5/5] Fixed freeze if EASY_OPTION_THREAD_SAFE_INIT is turned off. --- easy_profiler_core/include/easy/details/easy_compiler_support.h | 1 + 1 file changed, 1 insertion(+) 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 c8cff73e..c7a04c7f 100644 --- a/easy_profiler_core/include/easy/details/easy_compiler_support.h +++ b/easy_profiler_core/include/easy/details/easy_compiler_support.h @@ -195,6 +195,7 @@ static_assert(false, "EasyProfiler is not configured for using your compiler typ #ifndef EASY_LOCAL_STATIC_PTR # 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