mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Fix embedded/windows tests- move COND_manager and LOCK_manager to sql_manager.cc, to prevent race condition that results into accessing already destroyed critical section
This commit is contained in:
@ -2091,7 +2091,7 @@ extern pthread_mutex_t LOCK_mysql_create_db,LOCK_Acl,LOCK_open, LOCK_lock_db,
|
|||||||
LOCK_mapped_file,LOCK_user_locks, LOCK_status,
|
LOCK_mapped_file,LOCK_user_locks, LOCK_status,
|
||||||
LOCK_error_log, LOCK_delayed_insert, LOCK_short_uuid_generator,
|
LOCK_error_log, LOCK_delayed_insert, LOCK_short_uuid_generator,
|
||||||
LOCK_delayed_status, LOCK_delayed_create, LOCK_crypt, LOCK_timezone,
|
LOCK_delayed_status, LOCK_delayed_create, LOCK_crypt, LOCK_timezone,
|
||||||
LOCK_slave_list, LOCK_active_mi, LOCK_manager, LOCK_global_read_lock,
|
LOCK_slave_list, LOCK_active_mi, LOCK_global_read_lock,
|
||||||
LOCK_global_system_variables, LOCK_user_conn,
|
LOCK_global_system_variables, LOCK_user_conn,
|
||||||
LOCK_prepared_stmt_count,
|
LOCK_prepared_stmt_count,
|
||||||
LOCK_bytes_sent, LOCK_bytes_received, LOCK_connection_count;
|
LOCK_bytes_sent, LOCK_bytes_received, LOCK_connection_count;
|
||||||
@ -2109,7 +2109,7 @@ extern pthread_mutex_t LOCK_stats;
|
|||||||
extern int mysqld_server_started;
|
extern int mysqld_server_started;
|
||||||
extern rw_lock_t LOCK_grant, LOCK_sys_init_connect, LOCK_sys_init_slave;
|
extern rw_lock_t LOCK_grant, LOCK_sys_init_connect, LOCK_sys_init_slave;
|
||||||
extern rw_lock_t LOCK_system_variables_hash;
|
extern rw_lock_t LOCK_system_variables_hash;
|
||||||
extern pthread_cond_t COND_refresh, COND_thread_count, COND_manager;
|
extern pthread_cond_t COND_refresh, COND_thread_count;
|
||||||
extern pthread_cond_t COND_global_read_lock;
|
extern pthread_cond_t COND_global_read_lock;
|
||||||
extern pthread_attr_t connection_attrib;
|
extern pthread_attr_t connection_attrib;
|
||||||
extern I_List<THD> threads;
|
extern I_List<THD> threads;
|
||||||
|
@ -1516,7 +1516,6 @@ static void clean_up_mutexes()
|
|||||||
(void) pthread_mutex_destroy(&LOCK_delayed_insert);
|
(void) pthread_mutex_destroy(&LOCK_delayed_insert);
|
||||||
(void) pthread_mutex_destroy(&LOCK_delayed_status);
|
(void) pthread_mutex_destroy(&LOCK_delayed_status);
|
||||||
(void) pthread_mutex_destroy(&LOCK_delayed_create);
|
(void) pthread_mutex_destroy(&LOCK_delayed_create);
|
||||||
(void) pthread_mutex_destroy(&LOCK_manager);
|
|
||||||
(void) pthread_mutex_destroy(&LOCK_crypt);
|
(void) pthread_mutex_destroy(&LOCK_crypt);
|
||||||
(void) pthread_mutex_destroy(&LOCK_bytes_sent);
|
(void) pthread_mutex_destroy(&LOCK_bytes_sent);
|
||||||
(void) pthread_mutex_destroy(&LOCK_bytes_received);
|
(void) pthread_mutex_destroy(&LOCK_bytes_received);
|
||||||
@ -1557,7 +1556,6 @@ static void clean_up_mutexes()
|
|||||||
(void) pthread_cond_destroy(&COND_global_read_lock);
|
(void) pthread_cond_destroy(&COND_global_read_lock);
|
||||||
(void) pthread_cond_destroy(&COND_thread_cache);
|
(void) pthread_cond_destroy(&COND_thread_cache);
|
||||||
(void) pthread_cond_destroy(&COND_flush_thread_cache);
|
(void) pthread_cond_destroy(&COND_flush_thread_cache);
|
||||||
(void) pthread_cond_destroy(&COND_manager);
|
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3817,7 +3815,6 @@ static int init_thread_environment()
|
|||||||
(void) pthread_mutex_init(&LOCK_delayed_insert,MY_MUTEX_INIT_FAST);
|
(void) pthread_mutex_init(&LOCK_delayed_insert,MY_MUTEX_INIT_FAST);
|
||||||
(void) pthread_mutex_init(&LOCK_delayed_status,MY_MUTEX_INIT_FAST);
|
(void) pthread_mutex_init(&LOCK_delayed_status,MY_MUTEX_INIT_FAST);
|
||||||
(void) pthread_mutex_init(&LOCK_delayed_create,MY_MUTEX_INIT_SLOW);
|
(void) pthread_mutex_init(&LOCK_delayed_create,MY_MUTEX_INIT_SLOW);
|
||||||
(void) pthread_mutex_init(&LOCK_manager,MY_MUTEX_INIT_FAST);
|
|
||||||
(void) pthread_mutex_init(&LOCK_crypt,MY_MUTEX_INIT_FAST);
|
(void) pthread_mutex_init(&LOCK_crypt,MY_MUTEX_INIT_FAST);
|
||||||
(void) pthread_mutex_init(&LOCK_bytes_sent,MY_MUTEX_INIT_FAST);
|
(void) pthread_mutex_init(&LOCK_bytes_sent,MY_MUTEX_INIT_FAST);
|
||||||
(void) pthread_mutex_init(&LOCK_bytes_received,MY_MUTEX_INIT_FAST);
|
(void) pthread_mutex_init(&LOCK_bytes_received,MY_MUTEX_INIT_FAST);
|
||||||
@ -3857,7 +3854,6 @@ static int init_thread_environment()
|
|||||||
(void) pthread_cond_init(&COND_global_read_lock,NULL);
|
(void) pthread_cond_init(&COND_global_read_lock,NULL);
|
||||||
(void) pthread_cond_init(&COND_thread_cache,NULL);
|
(void) pthread_cond_init(&COND_thread_cache,NULL);
|
||||||
(void) pthread_cond_init(&COND_flush_thread_cache,NULL);
|
(void) pthread_cond_init(&COND_flush_thread_cache,NULL);
|
||||||
(void) pthread_cond_init(&COND_manager,NULL);
|
|
||||||
#ifdef HAVE_REPLICATION
|
#ifdef HAVE_REPLICATION
|
||||||
(void) pthread_mutex_init(&LOCK_rpl_status, MY_MUTEX_INIT_FAST);
|
(void) pthread_mutex_init(&LOCK_rpl_status, MY_MUTEX_INIT_FAST);
|
||||||
(void) pthread_cond_init(&COND_rpl_status, NULL);
|
(void) pthread_cond_init(&COND_rpl_status, NULL);
|
||||||
|
@ -44,6 +44,7 @@ static struct handler_cb * volatile cb_list;
|
|||||||
bool mysql_manager_submit(void (*action)())
|
bool mysql_manager_submit(void (*action)())
|
||||||
{
|
{
|
||||||
bool result= FALSE;
|
bool result= FALSE;
|
||||||
|
DBUG_ASSERT(manager_thread_in_use);
|
||||||
struct handler_cb * volatile *cb;
|
struct handler_cb * volatile *cb;
|
||||||
pthread_mutex_lock(&LOCK_manager);
|
pthread_mutex_lock(&LOCK_manager);
|
||||||
cb= &cb_list;
|
cb= &cb_list;
|
||||||
@ -75,8 +76,9 @@ pthread_handler_t handle_manager(void *arg __attribute__((unused)))
|
|||||||
|
|
||||||
pthread_detach_this_thread();
|
pthread_detach_this_thread();
|
||||||
manager_thread = pthread_self();
|
manager_thread = pthread_self();
|
||||||
|
(void) pthread_cond_init(&COND_manager,NULL);
|
||||||
|
(void) pthread_mutex_init(&LOCK_manager,NULL);
|
||||||
manager_thread_in_use = 1;
|
manager_thread_in_use = 1;
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
pthread_mutex_lock(&LOCK_manager);
|
pthread_mutex_lock(&LOCK_manager);
|
||||||
@ -123,6 +125,8 @@ pthread_handler_t handle_manager(void *arg __attribute__((unused)))
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
manager_thread_in_use = 0;
|
manager_thread_in_use = 0;
|
||||||
|
(void) pthread_mutex_destroy(&LOCK_manager);
|
||||||
|
(void) pthread_cond_destroy(&COND_manager);
|
||||||
DBUG_LEAVE; // Can't use DBUG_RETURN after my_thread_end
|
DBUG_LEAVE; // Can't use DBUG_RETURN after my_thread_end
|
||||||
my_thread_end();
|
my_thread_end();
|
||||||
return (NULL);
|
return (NULL);
|
||||||
@ -149,14 +153,14 @@ void stop_handle_manager()
|
|||||||
{
|
{
|
||||||
DBUG_ENTER("stop_handle_manager");
|
DBUG_ENTER("stop_handle_manager");
|
||||||
abort_manager = true;
|
abort_manager = true;
|
||||||
pthread_mutex_lock(&LOCK_manager);
|
|
||||||
if (manager_thread_in_use)
|
if (manager_thread_in_use)
|
||||||
{
|
{
|
||||||
|
pthread_mutex_lock(&LOCK_manager);
|
||||||
DBUG_PRINT("quit", ("initiate shutdown of handle manager thread: 0x%lx",
|
DBUG_PRINT("quit", ("initiate shutdown of handle manager thread: 0x%lx",
|
||||||
(ulong)manager_thread));
|
(ulong)manager_thread));
|
||||||
pthread_cond_signal(&COND_manager);
|
pthread_cond_signal(&COND_manager);
|
||||||
|
pthread_mutex_unlock(&LOCK_manager);
|
||||||
}
|
}
|
||||||
pthread_mutex_unlock(&LOCK_manager);
|
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user