X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fpbd%2Fpthread_utils.cc;h=5daa60ac424aec37fd6252bd0d2c490f59af04e8;hb=78b82b7ff2e28d53faae176776491404115ce02c;hp=b8ca8fc09346274d7dd441ae68d1e0671e7c8534;hpb=59076a7e4c66db12bbbfbf01f012ca2f6ba4bf56;p=ardour.git diff --git a/libs/pbd/pthread_utils.cc b/libs/pbd/pthread_utils.cc index b8ca8fc093..5daa60ac42 100644 --- a/libs/pbd/pthread_utils.cc +++ b/libs/pbd/pthread_utils.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2002 Paul Davis + Copyright (C) 2002 Paul Davis This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -44,7 +44,7 @@ static pthread_mutex_t thread_map_lock = PTHREAD_MUTEX_INITIALIZER; static Glib::Threads::Private thread_name (free); namespace PBD { - PBD::Signal4 ThreadCreatedWithRequestSize; + PBD::Signal3 ThreadCreatedWithRequestSize; } using namespace PBD; @@ -58,17 +58,25 @@ static int thread_creator (pthread_t* thread_id, const pthread_attr_t* attr, voi #endif } + void -PBD::notify_gui_about_thread_creation (std::string target_gui, pthread_t thread, std::string str, int request_count) +PBD::notify_event_loops_about_thread_creation (pthread_t thread, const std::string& emitting_thread_name, int request_count) { - ThreadCreatedWithRequestSize (target_gui, thread, str, request_count); + /* notify threads that may exist in the future (they may also exist + * already, in which case they will catch the + * ThreadCreatedWithRequestSize signal) + */ + EventLoop::pre_register (emitting_thread_name, request_count); + + /* notify all existing threads */ + ThreadCreatedWithRequestSize (thread, emitting_thread_name, request_count); } struct ThreadStartWithName { void* (*thread_work)(void*); void* arg; std::string name; - + ThreadStartWithName (void* (*f)(void*), void* a, const std::string& s) : thread_work (f), arg (a), name (s) {} }; @@ -110,7 +118,7 @@ fake_thread_start (void* arg) return ret; } -int +int pthread_create_and_store (string name, pthread_t *thread, void * (*start_routine)(void *), void * arg) { pthread_attr_t default_attr; @@ -137,8 +145,8 @@ void pthread_set_name (const char *str) { /* copy string and delete it when exiting */ - - thread_name.set (strdup (str)); + + thread_name.set (strdup (str)); // leaks } const char * @@ -148,13 +156,13 @@ pthread_name () if (str) { return str; - } + } return "unknown"; } void -pthread_kill_all (int signum) -{ +pthread_kill_all (int signum) +{ pthread_mutex_lock (&thread_map_lock); for (ThreadMap::iterator i = all_threads.begin(); i != all_threads.end(); ++i) { if (!pthread_equal ((*i), pthread_self())) { @@ -166,8 +174,8 @@ pthread_kill_all (int signum) } void -pthread_cancel_all () -{ +pthread_cancel_all () +{ pthread_mutex_lock (&thread_map_lock); for (ThreadMap::iterator i = all_threads.begin(); i != all_threads.end(); ) { @@ -186,8 +194,8 @@ pthread_cancel_all () } void -pthread_cancel_one (pthread_t thread) -{ +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 (pthread_equal ((*i), thread)) { @@ -199,4 +207,3 @@ pthread_cancel_one (pthread_t thread) pthread_cancel (thread); pthread_mutex_unlock (&thread_map_lock); } -