From 04bf9d1e9594688db4a69c3660feef2efe23945b Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 15 Aug 2013 11:44:47 -0400 Subject: fix newly-appearing crash-at-close caused by muddled thinking in pbd/pthread_utils threads created with this code can now just return a value as they normally would, and the infrastructure will ensure cleanup. there is no longer any reason to call pthread_exit_pbd() and so that has been removed. --- gtk2_ardour/editor_audio_import.cc | 2 -- libs/ardour/butler.cc | 4 +-- libs/pbd/pbd/pthread_utils.h | 1 - libs/pbd/pthread_utils.cc | 53 ++++++++++++++++++++++++-------------- 4 files changed, 34 insertions(+), 26 deletions(-) diff --git a/gtk2_ardour/editor_audio_import.cc b/gtk2_ardour/editor_audio_import.cc index 3cb2d378c2..7089372e63 100644 --- a/gtk2_ardour/editor_audio_import.cc +++ b/gtk2_ardour/editor_audio_import.cc @@ -962,7 +962,5 @@ void * Editor::import_thread () { _session->import_files (import_status); - pthread_exit_pbd (0); - /*NOTREACHED*/ return 0; } diff --git a/libs/ardour/butler.cc b/libs/ardour/butler.cc index db1b316368..a948c185b8 100644 --- a/libs/ardour/butler.cc +++ b/libs/ardour/butler.cc @@ -185,7 +185,7 @@ Butler::thread_work () break; case Request::Quit: - pthread_exit_pbd (0); + return 0; /*NOTREACHED*/ break; @@ -327,8 +327,6 @@ restart: empty_pool_trash (); } - pthread_exit_pbd (0); - /*NOTREACHED*/ return (0); } diff --git a/libs/pbd/pbd/pthread_utils.h b/libs/pbd/pbd/pthread_utils.h index 793c3a1980..0c7b5f3ac1 100644 --- a/libs/pbd/pbd/pthread_utils.h +++ b/libs/pbd/pbd/pthread_utils.h @@ -31,7 +31,6 @@ int pthread_create_and_store (std::string name, pthread_t *thread, void * (*st void pthread_cancel_one (pthread_t thread); void pthread_cancel_all (); void pthread_kill_all (int signum); -void pthread_exit_pbd (void* status); const char* pthread_name (); void pthread_set_name (const char* name); diff --git a/libs/pbd/pthread_utils.cc b/libs/pbd/pthread_utils.cc index e8b5e2690d..3d3cb96fb5 100644 --- a/libs/pbd/pthread_utils.cc +++ b/libs/pbd/pthread_utils.cc @@ -72,12 +72,34 @@ fake_thread_start (void* arg) void* (*thread_work)(void*) = ts->thread_work; void* thread_arg = ts->arg; + /* name will be deleted by the default handler for GStaticPrivate, when the thread exits */ + pthread_set_name (ts->name.c_str()); + /* we don't need this object anymore */ + delete ts; - /* name will be deleted by the default handler for GStaticPrivate, when the thread exits */ - return thread_work (thread_arg); + /* actually run the thread's work function */ + + void* ret = thread_work (thread_arg); + + /* cleanup */ + + pthread_mutex_lock (&thread_map_lock); + + for (ThreadMap::iterator i = all_threads.begin(); i != all_threads.end(); ++i) { + if (pthread_equal ((*i), pthread_self())) { + all_threads.erase (i); + break; + } + } + + pthread_mutex_unlock (&thread_map_lock); + + /* done */ + + return ret; } int @@ -139,10 +161,16 @@ void pthread_cancel_all () { pthread_mutex_lock (&thread_map_lock); - for (ThreadMap::iterator i = all_threads.begin(); i != all_threads.end(); ++i) { - if ((*i) != pthread_self()) { + for (ThreadMap::iterator i = all_threads.begin(); i != all_threads.end(); ) { + + ThreadMap::iterator nxt = i; + ++nxt; + + if (!pthread_equal ((*i), pthread_self())) { pthread_cancel ((*i)); } + + i = nxt; } all_threads.clear(); pthread_mutex_unlock (&thread_map_lock); @@ -153,7 +181,7 @@ pthread_cancel_one (pthread_t thread) { pthread_mutex_lock (&thread_map_lock); for (ThreadMap::iterator i = all_threads.begin(); i != all_threads.end(); ++i) { - if ((*i) == thread) { + if (pthread_equal ((*i), thread)) { all_threads.erase (i); break; } @@ -163,18 +191,3 @@ pthread_cancel_one (pthread_t thread) pthread_mutex_unlock (&thread_map_lock); } -void -pthread_exit_pbd (void* status) -{ - pthread_t thread = pthread_self(); - - pthread_mutex_lock (&thread_map_lock); - for (ThreadMap::iterator i = all_threads.begin(); i != all_threads.end(); ++i) { - if ((*i) == thread) { - all_threads.erase (i); - break; - } - } - pthread_mutex_unlock (&thread_map_lock); - pthread_exit (status); -} -- cgit v1.2.3