about summary refs log tree commit diff
path: root/htl/pt-dealloc.c
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2022-01-22 00:12:05 +0000
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2022-01-22 02:17:19 +0100
commit8c86ba446367fd676457e51eb44d7af2e5d9a392 (patch)
tree110b0549f3a5708a1b27714d752fa1551e465f70 /htl/pt-dealloc.c
parente22a4557eb39d7cba9a74d70f4582c13f1a7a83a (diff)
downloadglibc-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.c13
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;
 }