From e251f9d827a54d69007bae3200da8e7ff6e9019e Mon Sep 17 00:00:00 2001 From: "monty@hundin.mysql.fi" <> Date: Fri, 31 Aug 2001 23:02:09 +0300 Subject: Fixed problem with INSERT DELAYED Make killing threads safer --- sql/mysqld.cc | 4 +++- sql/sql_class.cc | 12 ++++++------ sql/sql_insert.cc | 8 +++++--- 3 files changed, 14 insertions(+), 10 deletions(-) (limited to 'sql') diff --git a/sql/mysqld.cc b/sql/mysqld.cc index b484eee3480..1255b55a81c 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -509,12 +509,14 @@ static void close_connections(void) if (tmp->mysys_var) { tmp->mysys_var->abort=1; - if (tmp->mysys_var->current_mutex) + pthread_mutex_lock(&tmp->mysys_var->mutex); + if (tmp->mysys_var->current_cond) { pthread_mutex_lock(tmp->mysys_var->current_mutex); pthread_cond_broadcast(tmp->mysys_var->current_cond); pthread_mutex_unlock(tmp->mysys_var->current_mutex); } + pthread_mutex_unlock(&tmp->mysys_var->mutex); } } (void) pthread_mutex_unlock(&LOCK_thread_count); // For unlink from list diff --git a/sql/sql_class.cc b/sql/sql_class.cc index c57b59f55a6..ace7c291ed3 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -226,12 +226,12 @@ void THD::prepare_to_die() pthread_mutex_lock(&mysys_var->mutex); if (!system_thread) // Don't abort locks mysys_var->abort=1; - if (mysys_var->current_mutex) - { - pthread_mutex_lock(mysys_var->current_mutex); - pthread_cond_broadcast(mysys_var->current_cond); - pthread_mutex_unlock(mysys_var->current_mutex); - } + if (mysys_var->current_cond) + { + pthread_mutex_lock(mysys_var->current_mutex); + pthread_cond_broadcast(mysys_var->current_cond); + pthread_mutex_unlock(mysys_var->current_mutex); + } pthread_mutex_unlock(&mysys_var->mutex); } } diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index c14fbda3bc5..e6872fa1696 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -511,10 +511,12 @@ public: delayed_row *row; while ((row=rows.get())) delete row; - pthread_mutex_destroy(&mutex); if (table) close_thread_tables(&thd); VOID(pthread_mutex_lock(&LOCK_thread_count)); + pthread_mutex_destroy(&mutex); + pthread_cond_destroy(&cond); + pthread_cond_destroy(&cond_client); thd.unlink(); // Must be unlinked under lock x_free(thd.query); thd.user=thd.host=0; @@ -842,7 +844,7 @@ void kill_delayed_threads(void) if (tmp->thd.mysys_var) { pthread_mutex_lock(&tmp->thd.mysys_var->mutex); - if (tmp->thd.mysys_var->current_mutex) + if (tmp->thd.mysys_var->current_cond) { if (&tmp->mutex != tmp->thd.mysys_var->current_mutex) pthread_mutex_lock(tmp->thd.mysys_var->current_mutex); @@ -970,7 +972,7 @@ static pthread_handler_decl(handle_delayed_insert,arg) di->thd.proc_info=0; DBUG_PRINT("info",("Waiting for someone to insert rows")); - for ( ; ;) + while (!thd->killed) { int error; #if (defined(HAVE_BROKEN_COND_TIMEDWAIT) || defined(HAVE_LINUXTHREADS)) -- cgit v1.2.1