mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-11 00:56:33 +01:00
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.
This commit is contained in:
parent
588cc3af74
commit
04bf9d1e95
4 changed files with 36 additions and 28 deletions
|
|
@ -962,7 +962,5 @@ void *
|
||||||
Editor::import_thread ()
|
Editor::import_thread ()
|
||||||
{
|
{
|
||||||
_session->import_files (import_status);
|
_session->import_files (import_status);
|
||||||
pthread_exit_pbd (0);
|
|
||||||
/*NOTREACHED*/
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -185,7 +185,7 @@ Butler::thread_work ()
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Request::Quit:
|
case Request::Quit:
|
||||||
pthread_exit_pbd (0);
|
return 0;
|
||||||
/*NOTREACHED*/
|
/*NOTREACHED*/
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
@ -327,8 +327,6 @@ restart:
|
||||||
empty_pool_trash ();
|
empty_pool_trash ();
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_exit_pbd (0);
|
|
||||||
/*NOTREACHED*/
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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_one (pthread_t thread);
|
||||||
void pthread_cancel_all ();
|
void pthread_cancel_all ();
|
||||||
void pthread_kill_all (int signum);
|
void pthread_kill_all (int signum);
|
||||||
void pthread_exit_pbd (void* status);
|
|
||||||
const char* pthread_name ();
|
const char* pthread_name ();
|
||||||
void pthread_set_name (const char* name);
|
void pthread_set_name (const char* name);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -72,12 +72,34 @@ fake_thread_start (void* arg)
|
||||||
void* (*thread_work)(void*) = ts->thread_work;
|
void* (*thread_work)(void*) = ts->thread_work;
|
||||||
void* thread_arg = ts->arg;
|
void* thread_arg = ts->arg;
|
||||||
|
|
||||||
pthread_set_name (ts->name.c_str());
|
|
||||||
|
|
||||||
delete ts;
|
|
||||||
/* name will be deleted by the default handler for GStaticPrivate, when the thread exits */
|
/* name will be deleted by the default handler for GStaticPrivate, when the thread exits */
|
||||||
|
|
||||||
return thread_work (thread_arg);
|
pthread_set_name (ts->name.c_str());
|
||||||
|
|
||||||
|
/* we don't need this object anymore */
|
||||||
|
|
||||||
|
delete ts;
|
||||||
|
|
||||||
|
/* 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
|
int
|
||||||
|
|
@ -139,10 +161,16 @@ void
|
||||||
pthread_cancel_all ()
|
pthread_cancel_all ()
|
||||||
{
|
{
|
||||||
pthread_mutex_lock (&thread_map_lock);
|
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(); ) {
|
||||||
if ((*i) != pthread_self()) {
|
|
||||||
|
ThreadMap::iterator nxt = i;
|
||||||
|
++nxt;
|
||||||
|
|
||||||
|
if (!pthread_equal ((*i), pthread_self())) {
|
||||||
pthread_cancel ((*i));
|
pthread_cancel ((*i));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
i = nxt;
|
||||||
}
|
}
|
||||||
all_threads.clear();
|
all_threads.clear();
|
||||||
pthread_mutex_unlock (&thread_map_lock);
|
pthread_mutex_unlock (&thread_map_lock);
|
||||||
|
|
@ -153,7 +181,7 @@ pthread_cancel_one (pthread_t thread)
|
||||||
{
|
{
|
||||||
pthread_mutex_lock (&thread_map_lock);
|
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(); ++i) {
|
||||||
if ((*i) == thread) {
|
if (pthread_equal ((*i), thread)) {
|
||||||
all_threads.erase (i);
|
all_threads.erase (i);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -163,18 +191,3 @@ pthread_cancel_one (pthread_t thread)
|
||||||
pthread_mutex_unlock (&thread_map_lock);
|
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);
|
|
||||||
}
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue