List:Commits« Previous MessageNext Message »
From:monty Date:November 29 2006 8:14pm
Subject:bk commit into 5.0 tree (monty:1.2326) BUG#24387
View as plain text  
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#24387monty29 Nov