• Marko Mäkelä's avatar
    MDEV-34678 pthread_mutex_init() without pthread_mutex_destroy() · 4f8803c0
    Marko Mäkelä authored
    When SUX_LOCK_GENERIC is defined, the srw_mutex, srw_lock, sux_lock are
    implemented based on pthread_mutex_t and pthread_cond_t.  This is the
    only option for systems that lack a futex-like system call.
    
    In the SUX_LOCK_GENERIC mode, if pthread_mutex_init() is allocating
    some resources that need to be freed by pthread_mutex_destroy(),
    a memory leak could occur when we are repeatedly invoking
    pthread_mutex_init() without a pthread_mutex_destroy() in between.
    
    pthread_mutex_wrapper::initialized: A debug field to track whether
    pthread_mutex_init() has been invoked.  This also helps find bugs
    like the one that was fixed by
    commit 1c8af2ae (MDEV-34422);
    one simply needs to add -DSUX_LOCK_GENERIC to the CMAKE_CXX_FLAGS
    to catch that particular bug on the initial server bootstrap.
    
    buf_block_init(), buf_page_init_for_read(): Invoke block_lock::init()
    because buf_page_t::init() will no longer do that.
    
    buf_page_t::init(): Instead of invoking lock.init(), assert that it
    has already been invoked (the lock is vacant).
    
    add_fts_index(), build_fts_hidden_table(): Explicitly invoke
    index_lock::init() in order to avoid a pthread_mutex_destroy()
    invocation on an uninitialized object.
    
    srw_lock_debug::destroy(): Invoke readers_lock.destroy().
    
    trx_sys_t::create(): Invoke trx_rseg_t::init() on all rollback segments
    in order to guarantee a deterministic state for shutdown, even if
    InnoDB fails to start up.
    
    trx_rseg_array_init(), trx_temp_rseg_create(), trx_rseg_create():
    Invoke trx_rseg_t::destroy() before trx_rseg_t::init() in order to
    balance pthread_mutex_init() and pthread_mutex_destroy() calls.
    4f8803c0
trx0rseg.cc 23.5 KB