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 /src | |
| parent | 40ff5fa06f4c9749e4bee9a8c2b18fe50e1210ab (diff) | |
make sure we don't crash if pa_thread_join() is called more than once on the same pa_thread object
Diffstat (limited to 'src')
| -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;  } - | 
