X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fthread%2Fpthread_detach.c;h=77772af2c6349fca2cd66860c71e910c3138b101;hb=e95538fa07d2b460b25ee6c2fef05f820888776d;hp=ed77f74d520bff3a16ef5e055f08bbf021fe91d4;hpb=23614b0fcb4cd4d7b2e4148d3b1887b642169765;p=musl diff --git a/src/thread/pthread_detach.c b/src/thread/pthread_detach.c index ed77f74d..77772af2 100644 --- a/src/thread/pthread_detach.c +++ b/src/thread/pthread_detach.c @@ -1,15 +1,12 @@ #include "pthread_impl.h" #include -int __pthread_join(pthread_t, void **); - static int __pthread_detach(pthread_t t) { - /* Cannot detach a thread that's already exiting */ - if (a_swap(t->exitlock, 1)) + /* 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); - t->detached = 2; - __unlock(t->exitlock); return 0; }