X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fpbd%2Fpthread_utils.cc;h=b8ca8fc09346274d7dd441ae68d1e0671e7c8534;hb=ce818efe37a1e8a68789a9eb8124fd828b672dd7;hp=96cf99716f3aa135c8078f478003d2c15ef6869e;hpb=0aac62e013e15e380001dafae39d554f8765a4a1;p=ardour.git diff --git a/libs/pbd/pthread_utils.cc b/libs/pbd/pthread_utils.cc index 96cf99716f..b8ca8fc093 100644 --- a/libs/pbd/pthread_utils.cc +++ b/libs/pbd/pthread_utils.cc @@ -28,6 +28,14 @@ #include #endif +#ifdef COMPILER_MSVC +DECLARE_DEFAULT_COMPARISONS(pthread_t) // Needed for 'DECLARE_DEFAULT_COMPARISONS'. Objects in an STL container can be + // searched and sorted. Thus, when instantiating the container, MSVC complains + // if the type of object being contained has no appropriate comparison operators + // defined (specifically, if operators '<' and '==' are undefined). This seems + // to be the case with ptw32 'pthread_t' which is a simple struct. +#endif + using namespace std; typedef std::list ThreadMap; @@ -72,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 @@ -139,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); @@ -163,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); -}