Below is the list of changes that have just been committed into a local
5.0 repository of monty. When monty does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet@stripped, 2006-11-29 22:14:08+02:00, monty@stripped +3 -0
Ignore some generated files
Don't return from my_thread_global_end() until all threads have called my_thread_end()
Bug#24387: Valgrind: my_thread_init (handle_sl sql, handle_one_conn, handle_slave_io)
BitKeeper/etc/ignore@stripped, 2006-11-29 17:34:38+02:00, monty@stripped +2 -0
added *.gcda *.gcno
BitKeeper/etc/ignore@stripped, 2006-11-29 17:33:43+02:00, monty@stripped +5 -0
added bdb/dist/db.h bdb/dist/db_config.h bdb/dist/db_cxx.h bdb/dist/db_int.h bdb/dist/include.tcl
include/my_pthread.h@stripped, 2006-11-29 22:14:06+02:00, monty@stripped +1 -2
Added my_thread_end_wait_time
Removed not used thread variables
mysys/my_thr_init.c@stripped, 2006-11-29 22:14:06+02:00, monty@stripped +40 -10
Add thread counters.
Don't return from my_thread_global_end() until all threads have called my_thread_end()
(Or a timeout (5 seconds) has elapsed)
This fixed some valgrind warnings
Bug#24387: Valgrind: my_thread_init (handle_sl sql, handle_one_conn, handle_slave_io)
# This is a BitKeeper patch. What follows are the unified diffs for the
# set of deltas contained in the patch. The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User: monty
# Host: narttu.mysql.fi
# Root: /home/my/mysql-5.0
--- 1.91/include/my_pthread.h 2006-11-29 22:14:12 +02:00
+++ 1.92/include/my_pthread.h 2006-11-29 22:14:12 +02:00
@@ -677,14 +677,13 @@
};
extern struct st_my_thread_var *_my_thread_var(void) __attribute__ ((const));
+extern uint my_thread_end_wait_time;
#define my_thread_var (_my_thread_var())
#define my_errno my_thread_var->thr_errno
/*
Keep track of shutdown,signal, and main threads so that my_end() will not
report errors with them
*/
-extern pthread_t shutdown_th, main_th, signal_th;
-
/* statistics_xxx functions are for not essential statistic */
#ifndef thread_safe_increment
--- 1.31/mysys/my_thr_init.c 2006-11-29 22:14:12 +02:00
+++ 1.32/mysys/my_thr_init.c 2006-11-29 22:14:12 +02:00
@@ -30,7 +30,10 @@
#endif /* USE_TLS */
pthread_mutex_t THR_LOCK_malloc,THR_LOCK_open,
THR_LOCK_lock,THR_LOCK_isam,THR_LOCK_myisam,THR_LOCK_heap,
- THR_LOCK_net, THR_LOCK_charset;
+ THR_LOCK_net, THR_LOCK_charset, THR_LOCK_threads;
+pthread_cond_t THR_COND_threads;
+uint THR_thread_count= 0;
+uint my_thread_end_wait_time= 5;
#if !defined(HAVE_LOCALTIME_R) || !defined(HAVE_GMTIME_R)
pthread_mutex_t LOCK_localtime_r;
#endif
@@ -79,7 +82,7 @@
#endif
#ifdef PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP
/*
- Set mutex type to "errorcheck" a.k.a "adaptive"
+ Set mutex type to "errorcheck"
*/
pthread_mutexattr_init(&my_errorcheck_mutexattr);
pthread_mutexattr_settype(&my_errorcheck_mutexattr,
@@ -94,6 +97,8 @@
pthread_mutex_init(&THR_LOCK_heap,MY_MUTEX_INIT_FAST);
pthread_mutex_init(&THR_LOCK_net,MY_MUTEX_INIT_FAST);
pthread_mutex_init(&THR_LOCK_charset,MY_MUTEX_INIT_FAST);
+ pthread_mutex_init(&THR_LOCK_threads,MY_MUTEX_INIT_FAST);
+ pthread_cond_init (&THR_COND_threads, NULL);
#if defined( __WIN__) || defined(OS2)
win_pthread_init();
#endif
@@ -114,6 +119,25 @@
void my_thread_global_end(void)
{
+ struct timespec abstime;
+ set_timespec(abstime, my_thread_end_wait_time);
+ my_bool all_threads_killed= 1;
+
+ pthread_mutex_lock(&THR_LOCK_threads);
+ while (THR_thread_count)
+ {
+ 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",
+ THR_thread_count);
+ all_threads_killed= 0;
+ }
+ }
+ pthread_mutex_unlock(&THR_LOCK_threads);
+
pthread_key_delete(THR_KEY_mysys);
#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP
pthread_mutexattr_destroy(&my_fast_mutexattr);
@@ -129,6 +153,11 @@
pthread_mutex_destroy(&THR_LOCK_heap);
pthread_mutex_destroy(&THR_LOCK_net);
pthread_mutex_destroy(&THR_LOCK_charset);
+ if (all_threads_killed)
+ {
+ pthread_mutex_destroy(&THR_LOCK_threads);
+ pthread_cond_destroy (&THR_COND_threads);
+ }
#if !defined(HAVE_LOCALTIME_R) || !defined(HAVE_GMTIME_R)
pthread_mutex_destroy(&LOCK_localtime_r);
#endif
@@ -154,9 +183,6 @@
#ifdef EXTRA_DEBUG_THREADS
fprintf(stderr,"my_thread_init(): thread_id=%ld\n",pthread_self());
#endif
-#if !defined(__WIN__) || defined(USE_TLS) || ! defined(SAFE_MUTEX)
- pthread_mutex_lock(&THR_LOCK_lock);
-#endif
#if !defined(__WIN__) || defined(USE_TLS)
if (my_pthread_getspecific(struct st_my_thread_var *,THR_KEY_mysys))
@@ -174,7 +200,7 @@
}
pthread_setspecific(THR_KEY_mysys,tmp);
-#else
+#else /* defined(__WIN__) && !(defined(USE_TLS) */
/*
Skip initialization if the thread specific variable is already initialized
*/
@@ -182,7 +208,6 @@
goto end;
tmp= &THR_KEY_mysys;
#endif
- tmp->id= ++thread_id;
#if defined(__WIN__) && defined(EMBEDDED_LIBRARY)
tmp->thread_self= (pthread_t)getpid();
#endif
@@ -190,10 +215,11 @@
pthread_cond_init(&tmp->suspend, NULL);
tmp->init= 1;
+ pthread_mutex_lock(&THR_LOCK_threads);
+ tmp->id= ++thread_id;
+ ++THR_thread_count;
+ pthread_mutex_unlock(&THR_LOCK_threads);
end:
-#if !defined(__WIN__) || defined(USE_TLS) || ! defined(SAFE_MUTEX)
- pthread_mutex_unlock(&THR_LOCK_lock);
-#endif
return error;
}
@@ -232,6 +258,10 @@
#if (!defined(__WIN__) && !defined(OS2)) || 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)
--- 1.237/BitKeeper/etc/ignore 2006-11-29 22:14:12 +02:00
+++ 1.239/BitKeeper/etc/ignore 2006-11-29 22:14:12 +02:00
@@ -1323,3 +1323,10 @@
zlib/*.ds?
zlib/*.vcproj
mysql-test/r/*.warnings
+bdb/dist/db.h
+bdb/dist/db_config.h
+bdb/dist/db_cxx.h
+bdb/dist/db_int.h
+bdb/dist/include.tcl
+*.gcda
+*.gcno
| Thread |
|---|
| • bk commit into 5.0 tree (monty:1.2326) BUG#24387 | monty | 29 Nov |