• Staale Smedseng's avatar
    Bug #45058 init_available_charsets uses double checked locking · 8969530c
    Staale Smedseng authored
          
    As documented in the bug report, the double checked locking
    pattern has inherent issues, and cannot guarantee correct
    initialization.
    
    This patch replaces the logic in init_available_charsets()
    with the use of pthread_once(3). A wrapper function,
    my_pthread_once(), is introduced and is used in lieu of direct
    calls to init_available_charsets(). Related defines
    MY_PTHREAD_ONCE_* are also introduced.
    
    For the Windows platform, the implementation in lp:sysbench is
    ported. For single-thread use, a simple define calls the
    function and sets the pthread_once control variable.
    
    Charset initialization is modified to use my_pthread_once().
    
    include/my_no_pthread.h:
      Dummy my_pthread_once() for single thread use.
    include/my_pthread.h:
      Declaration for new function my_pthread_once().
    mysys/charset.c:
      Logic in init_available_charsets() is simplified. 
      Using my_pthread_once() for all calls to this func.
    mysys/my_winthread.c:
      Windows implementation of my_pthread_once().
    8969530c
charset.c 22.7 KB