From 9e5ec3539e2c99924c132730297d1e9db47f5959 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 30 Nov 2006 22:00:05 +0200 Subject: Don't abort if we call my_thread_end() multiple times Fixed new introduced bug in my_time.c BitKeeper/deleted/.del-valgrind.supp.orig: Delete: mysql-test/valgrind.supp.orig mysys/my_thr_init.c: More comments Don't abort if we call my_thread_end() multiple times sql-common/my_time.c: Fixed wrong patch in last commit sql/sql_cache.cc: Fixed old bad merge (not critical) sql/tztime.cc: Portability fix --- mysys/my_thr_init.c | 61 +++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 48 insertions(+), 13 deletions(-) (limited to 'mysys/my_thr_init.c') diff --git a/mysys/my_thr_init.c b/mysys/my_thr_init.c index 152bf486508..c068e28be4b 100644 --- a/mysys/my_thr_init.c +++ b/mysys/my_thr_init.c @@ -120,20 +120,22 @@ my_bool my_thread_global_init(void) void my_thread_global_end(void) { struct timespec abstime; - set_timespec(abstime, my_thread_end_wait_time); my_bool all_threads_killed= 1; + set_timespec(abstime, my_thread_end_wait_time); pthread_mutex_lock(&THR_LOCK_threads); - while (THR_thread_count) + while (THR_thread_count > 0) { int error= pthread_cond_timedwait(&THR_COND_threads, &THR_LOCK_threads, &abstime); if (error == ETIMEDOUT || error == ETIME) { if (THR_thread_count) - fprintf(stderr,"error in my_thread_global_end(): %d threads didn't exit\n", + fprintf(stderr, + "Error in my_thread_global_end(): %d threads didn't exit\n", THR_thread_count); all_threads_killed= 0; + break; } } pthread_mutex_unlock(&THR_LOCK_threads); @@ -169,10 +171,23 @@ void my_thread_global_end(void) static long thread_id=0; /* - We can't use mutex_locks here if we are using windows as - we may have compiled the program with SAFE_MUTEX, in which - case the checking of mutex_locks will not work until - the pthread_self thread specific variable is initialized. + Allocate thread specific memory for the thread, used by mysys and dbug + + SYNOPSIS + my_thread_init() + + NOTES + We can't use mutex_locks here if we are using windows as + we may have compiled the program with SAFE_MUTEX, in which + case the checking of mutex_locks will not work until + the pthread_self thread specific variable is initialized. + + This function may called multiple times for a thread, for example + if one uses my_init() followed by mysql_server_init(). + + RETURN + 0 ok + 1 Fatal error; mysys/dbug functions can't be used */ my_bool my_thread_init(void) @@ -224,14 +239,26 @@ end: } +/* + Deallocate memory used by the thread for book-keeping + + SYNOPSIS + my_thread_end() + + NOTE + This may be called multiple times for a thread. + This happens for example when one calls 'mysql_server_init()' + mysql_server_end() and then ends with a mysql_end(). +*/ + void my_thread_end(void) { struct st_my_thread_var *tmp; tmp= my_pthread_getspecific(struct st_my_thread_var*,THR_KEY_mysys); #ifdef EXTRA_DEBUG_THREADS - fprintf(stderr,"my_thread_end(): tmp=%p,thread_id=%ld\n", - tmp,pthread_self()); + fprintf(stderr,"my_thread_end(): tmp: 0x%lx thread_id=%ld\n", + (long) tmp, pthread_self()); #endif if (tmp && tmp->init) { @@ -253,15 +280,23 @@ void my_thread_end(void) #else tmp->init= 0; #endif + + /* + Decrement counter for number of running threads. We are using this + in my_thread_global_end() to wait until all threads have called + my_thread_end and thus freed all memory they have allocated in + my_thread_init() and DBUG_xxxx + */ + pthread_mutex_lock(&THR_LOCK_threads); + DBUG_ASSERT(THR_thread_count != 0); + if (--THR_thread_count == 0) + pthread_cond_signal(&THR_COND_threads); + pthread_mutex_unlock(&THR_LOCK_threads); } /* The following free has to be done, even if my_thread_var() is 0 */ #if !defined(__WIN__) || defined(USE_TLS) pthread_setspecific(THR_KEY_mysys,0); #endif - pthread_mutex_lock(&THR_LOCK_threads); - if (--THR_thread_count == 0) - pthread_cond_signal(&THR_COND_threads); - pthread_mutex_unlock(&THR_LOCK_threads); } struct st_my_thread_var *_my_thread_var(void) -- cgit v1.2.1