• Marko Mäkelä's avatar
    MDEV-34296 extern thread_local is a CPU waste · 699d38d9
    Marko Mäkelä authored
    In commit 99bd2260 (MDEV-31558)
    we wrongly thought that there would be minimal overhead for accessing
    a thread-local variable mariadb_stats.
    
    It turns out that in C++11, each access to an extern thread_local
    variable requires conditionally invoking an initialization function.
    In fact, the initializer expression of mariadb_stats is dynamic, and
    those calls were actually unavoidable.
    
    In C++20, one could declare constinit thread_local variables, but
    the address of a thread_local variable (&mariadb_dummy_stats) is not
    a compile-time constant. We did not want to declare mariadb_dummy_stats
    without thread_local, because then the dummy accesses could lead to
    cache line contention between threads.
    
    mariadb_stats: Declare as __thread or __declspec(thread) so that
    there will be no dynamic initialization, but zero-initialization.
    
    mariadb_dummy_stats: Remove. It is a lesser evil to let
    the environment perform zero-initialization and check if
    !mariadb_stats.
    
    Reviewed by: Sergei Petrunia
    699d38d9
mariadb_stats.h 3.18 KB