X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fthread%2Fpthread_detach.c;h=d73a500e79adc823b38dfe05e8218bdad88f4883;hb=d055e6a45a17673b8dd3ec16e786bb2fe1700dd5;hp=692bbaf9cb643d111c69dc52ac8f5acda2eb89d5;hpb=c4bc0b1a64e1ef1e105df84401805a16e8dbe82a;p=musl diff --git a/src/thread/pthread_detach.c b/src/thread/pthread_detach.c index 692bbaf9..d73a500e 100644 --- a/src/thread/pthread_detach.c +++ b/src/thread/pthread_detach.c @@ -1,15 +1,16 @@ #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_cas(t->exitlock, 0, INT_MIN + 1)) - return __pthread_join(t, 0); - t->detached = 2; - UNLOCK(t->exitlock); + /* 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) { + int cs; + __pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs); + __pthread_join(t, 0); + __pthread_setcancelstate(cs, 0); + } return 0; }