Commit 42fd48da authored by unknown's avatar unknown
Browse files

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:
  added *.gcda *.gcno
include/my_pthread.h:
  Added my_thread_end_wait_time
  Removed not used thread variables
mysys/my_thr_init.c:
  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)
parent 6ae9e9a5
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -1323,3 +1323,10 @@ win/vs8cache.txt
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
+1 −2
Original line number Diff line number Diff line
@@ -677,14 +677,13 @@ struct st_my_thread_var
};

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
+40 −10
Original line number Diff line number Diff line
@@ -30,7 +30,10 @@ pthread_key(struct st_my_thread_var, THR_KEY_mysys);
#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 @@ my_bool my_thread_global_init(void)
#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 @@ my_bool my_thread_global_init(void)
  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 @@ 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;

  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 @@ void my_thread_global_end(void)
  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 @@ my_bool my_thread_init(void)
#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 @@ my_bool my_thread_init(void)
  }
  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 @@ my_bool my_thread_init(void)
    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 @@ my_bool my_thread_init(void)
  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 @@ void my_thread_end(void)
#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)