summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2013-08-15 11:44:47 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2013-08-15 11:44:47 -0400
commit04bf9d1e9594688db4a69c3660feef2efe23945b (patch)
treedc7ca47730960e6544347cc2ef9e4a8606e87c97
parent588cc3af74524a3f6bdae16c93ba0975f55fcc1e (diff)
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.
-rw-r--r--gtk2_ardour/editor_audio_import.cc2
-rw-r--r--libs/ardour/butler.cc4
-rw-r--r--libs/pbd/pbd/pthread_utils.h1
-rw-r--r--libs/pbd/pthread_utils.cc53
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);
-}