diff options
author | Lennart Poettering <lennart@poettering.net> | 2008-08-08 22:31:24 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2008-08-08 22:31:24 +0200 |
commit | 6df029a1b1e56e0909e8b7f3991c24a70d9d3c33 (patch) | |
tree | 1a3952775baa5883f526503102ca9558a12e7d2b | |
parent | 40ff5fa06f4c9749e4bee9a8c2b18fe50e1210ab (diff) |
make sure we don't crash if pa_thread_join() is called more than once on the same pa_thread object
-rw-r--r-- | src/pulsecore/thread-posix.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/src/pulsecore/thread-posix.c b/src/pulsecore/thread-posix.c index 20ed16d9..ade398f9 100644 --- a/src/pulsecore/thread-posix.c +++ b/src/pulsecore/thread-posix.c @@ -41,6 +41,7 @@ struct pa_thread { pa_thread_func_t thread_func; void *userdata; pa_atomic_t running; + pa_bool_t joined; }; struct pa_tls { @@ -82,6 +83,7 @@ pa_thread* pa_thread_new(pa_thread_func_t thread_func, void *userdata) { t = pa_xnew(pa_thread, 1); t->thread_func = thread_func; t->userdata = userdata; + t->joined = FALSE; pa_atomic_store(&t->running, 0); if (pthread_create(&t->id, NULL, internal_thread_func, t) < 0) { @@ -115,7 +117,12 @@ void pa_thread_free(pa_thread *t) { int pa_thread_join(pa_thread *t) { pa_assert(t); + pa_assert(t->thread_func); + + if (t->joined) + return -1; + t->joined = TRUE; return pthread_join(t->id, NULL); } @@ -132,6 +139,7 @@ pa_thread* pa_thread_self(void) { t->id = pthread_self(); t->thread_func = NULL; t->userdata = NULL; + t->joined = TRUE; pa_atomic_store(&t->running, 2); PA_STATIC_TLS_SET(current_thread, t); @@ -192,4 +200,3 @@ void *pa_tls_set(pa_tls *t, void *userdata) { pa_assert_se(pthread_setspecific(t->key, userdata) == 0); return r; } - |