summaryrefslogtreecommitdiff
path: root/libs/pbd/pthread_utils.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2013-08-24 12:18:06 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2013-08-24 12:18:06 -0400
commitee1b49f87e4b8e6406c059f29371892872d3fb85 (patch)
tree107f163d9f707c97a0b8179a5f2afd9995d616ec /libs/pbd/pthread_utils.cc
parent8cd71108c1d153f84f25c3b9e5153a110826c130 (diff)
parent1421a34e52862b614f280c751a12893e4abecf88 (diff)
fix merge conflicts from master
Diffstat (limited to 'libs/pbd/pthread_utils.cc')
-rw-r--r--libs/pbd/pthread_utils.cc50
1 files changed, 32 insertions, 18 deletions
diff --git a/libs/pbd/pthread_utils.cc b/libs/pbd/pthread_utils.cc
index 91d93ec4f8..b8ca8fc093 100644
--- a/libs/pbd/pthread_utils.cc
+++ b/libs/pbd/pthread_utils.cc
@@ -80,12 +80,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
@@ -147,10 +169,17 @@ void
pthread_cancel_all ()
{
pthread_mutex_lock (&thread_map_lock);
- for (ThreadMap::iterator i = all_threads.begin(); i != all_threads.end(); ++i) {
+
+ 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);
@@ -171,18 +200,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 (pthread_equal ((*i), thread)) {
- all_threads.erase (i);
- break;
- }
- }
- pthread_mutex_unlock (&thread_map_lock);
- pthread_exit (status);
-}