X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fthread%2Fpthread_detach.c;h=77772af2c6349fca2cd66860c71e910c3138b101;hb=1ef37aa00ea830dfda76e04e3d941cafa74d8b76;hp=8ef03d514147c12a2408a1ca37e08bf1998751ae;hpb=2b71a4d1dfb0487cc2558df646a262ffb8261585;p=musl diff --git a/src/thread/pthread_detach.c b/src/thread/pthread_detach.c index 8ef03d51..77772af2 100644 --- a/src/thread/pthread_detach.c +++ b/src/thread/pthread_detach.c @@ -1,11 +1,14 @@ #include "pthread_impl.h" +#include -int pthread_detach(pthread_t t) +static int __pthread_detach(pthread_t t) { - /* Cannot detach a thread that's already exiting */ - if (a_swap(&t->exitlock, 1)) - return pthread_join(t, 0); - t->detached = 1; - t->exitlock = 0; + /* If the cas fails, detach state is either already-detached + * or exiting/exited, and pthread_join will trap or cleanup. */ + if (a_cas(&t->detach_state, DT_JOINABLE, DT_DETACHED) != DT_JOINABLE) + return __pthread_join(t, 0); return 0; } + +weak_alias(__pthread_detach, pthread_detach); +weak_alias(__pthread_detach, thrd_detach);