improve pthread_exit synchronization with functions targeting tid
authorRich Felker <dalias@aerifal.cx>
Fri, 4 May 2018 18:26:31 +0000 (14:26 -0400)
committerRich Felker <dalias@aerifal.cx>
Sat, 5 May 2018 15:09:51 +0000 (11:09 -0400)
commit526e64f54d729947b35fd39129bc86cbc0b5f098
treed13eff2e89069dadfff5ea537c56f422847f8def
parent4df42163511182bfd6fc55e85250b93786dcce7e
improve pthread_exit synchronization with functions targeting tid

if the last thread exited via pthread_exit, the logic that marked it
dead did not account for the possibility of it targeting itself via
atexit handlers. for example, an atexit handler calling
pthread_kill(pthread_self(), SIGKILL) would return success
(previously, ESRCH) rather than causing termination via the signal.

move the release of killlock after the determination is made whether
the exiting thread is the last thread. in the case where it's not,
move the release all the way to the end of the function. this way we
can clear the tid rather than spending storage on a dedicated
dead-flag. clearing the tid is also preferable in that it hardens
against inadvertent use of the value after the thread has terminated
but before it is joined.
src/internal/pthread_impl.h
src/thread/pthread_create.c
src/thread/pthread_getschedparam.c
src/thread/pthread_kill.c
src/thread/pthread_setschedparam.c
src/thread/pthread_setschedprio.c