diff --git a/src/internal/pthread_impl.h b/src/internal/pthread_impl.h index 0ce3c1e8fd7a891fbdd3befff52bc95ebfe85c60..46d8fdd2a317c424eb669fda5b6e00db8efacfcb 100644 --- a/src/internal/pthread_impl.h +++ b/src/internal/pthread_impl.h @@ -28,13 +28,12 @@ struct pthread { pid_t tid, pid; int tsd_used, errno_val, *errno_ptr; volatile int cancel, canceldisable, cancelasync; + int detached; unsigned char *map_base; size_t map_size; void *start_arg; void *(*start)(void *); void *result; - int detached; - int exitlock; struct __ptcb *cancelbuf; void **tsd; pthread_attr_t attr; @@ -47,7 +46,8 @@ struct pthread { int unblock_cancel; int delete_timer; locale_t locale; - int killlock; + int killlock[2]; + int exitlock[2]; }; struct __timer { diff --git a/src/thread/pthread_create.c b/src/thread/pthread_create.c index ae2f9e4e9b1cb6583e1820b50d150c4bab5de6dc..94dc308dceffcabf728f213b1290519f68f38381 100644 --- a/src/thread/pthread_create.c +++ b/src/thread/pthread_create.c @@ -24,12 +24,12 @@ void pthread_exit(void *result) __pthread_tsd_run_dtors(); - __lock(&self->exitlock); + __lock(self->exitlock); /* Mark this thread dead before decrementing count */ - __lock(&self->killlock); + __lock(self->killlock); self->dead = 1; - a_store(&self->killlock, 0); + __unlock(self->killlock); do n = libc.threads_minus_1; while (n && a_cas(&libc.threads_minus_1, n, n-1)!=n); diff --git a/src/thread/pthread_detach.c b/src/thread/pthread_detach.c index e80323982dd91704c47c7588896f288b47edc18b..651c38ebe86cc82ce51aca57731da21c48851e73 100644 --- a/src/thread/pthread_detach.c +++ b/src/thread/pthread_detach.c @@ -3,9 +3,9 @@ int pthread_detach(pthread_t t) { /* Cannot detach a thread that's already exiting */ - if (a_swap(&t->exitlock, 1)) + if (a_swap(t->exitlock, 1)) return pthread_join(t, 0); t->detached = 2; - a_store(&t->exitlock, 0); + __unlock(t->exitlock); return 0; } diff --git a/src/thread/pthread_kill.c b/src/thread/pthread_kill.c index 15f70fb97a18b1b7ca4334e44425a7f943cee0f6..d9a5096a06751781cc3c5d6ac5c923b7cc78d500 100644 --- a/src/thread/pthread_kill.c +++ b/src/thread/pthread_kill.c @@ -3,8 +3,8 @@ int pthread_kill(pthread_t t, int sig) { int r; - __lock(&t->killlock); + __lock(t->killlock); r = t->dead ? ESRCH : -__syscall(SYS_tgkill, t->pid, t->tid, sig); - __unlock(&t->killlock); + __unlock(t->killlock); return r; }