diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2022-01-22 00:12:05 +0000 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2022-01-22 02:17:19 +0100 |
commit | 8c86ba446367fd676457e51eb44d7af2e5d9a392 (patch) | |
tree | 110b0549f3a5708a1b27714d752fa1551e465f70 /htl/pt-dealloc.c | |
parent | e22a4557eb39d7cba9a74d70f4582c13f1a7a83a (diff) | |
download | glibc-8c86ba446367fd676457e51eb44d7af2e5d9a392.tar.gz glibc-8c86ba446367fd676457e51eb44d7af2e5d9a392.tar.xz glibc-8c86ba446367fd676457e51eb44d7af2e5d9a392.zip |
htl: Fix cleaning the reply port
If any RPC fails, the reply port will already be deallocated. __pthread_thread_terminate thus has to defer taking its name until the very last __thread_terminate_release which doesn't reply a message. But then we have to read from the pthread structure. This introduces __pthread_dealloc_finish() which does the recording of the thread termination, so the slot can be reused really only just before the __thread_terminate_release call. Only the real thread can set it, so let's decouple this from the pthread_state by just removing the PTHREAD_TERMINATED state and add a terminated field.
Diffstat (limited to 'htl/pt-dealloc.c')
-rw-r--r-- | htl/pt-dealloc.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/htl/pt-dealloc.c b/htl/pt-dealloc.c index 9cca718c7f..c776e3471d 100644 --- a/htl/pt-dealloc.c +++ b/htl/pt-dealloc.c @@ -29,12 +29,10 @@ extern struct __pthread *__pthread_free_threads; extern pthread_mutex_t __pthread_free_threads_lock; -/* Deallocate the thread structure for PTHREAD. */ +/* Deallocate the content of the thread structure for PTHREAD. */ void __pthread_dealloc (struct __pthread *pthread) { - assert (pthread->state != PTHREAD_TERMINATED); - if (!atomic_decrement_and_test (&pthread->nr_refs)) return; @@ -56,13 +54,18 @@ __pthread_dealloc (struct __pthread *pthread) __pthread_mutex_lock (&__pthread_free_threads_lock); __pthread_enqueue (&__pthread_free_threads, pthread); __pthread_mutex_unlock (&__pthread_free_threads_lock); +} - /* Setting PTHREAD->STATE to PTHREAD_TERMINATED makes this TCB +/* Confirm deallocation of the thread structure for PTHREAD. */ +void +__pthread_dealloc_finish (struct __pthread *pthread) +{ + /* Setting PTHREAD->TERMINATED makes this TCB available for reuse. After that point, we can no longer assume that PTHREAD is valid. Note that it is safe to not lock this update to PTHREAD->STATE: the only way that it can now be accessed is in __pthread_alloc, which reads this variable. */ - pthread->state = PTHREAD_TERMINATED; + pthread->terminated = TRUE; } |