OSDN Git Service

prevent cancellation functions from being called more than once
authorMike Frysinger <vapier@gentoo.org>
Thu, 9 Nov 2006 08:14:00 +0000 (08:14 -0000)
committerMike Frysinger <vapier@gentoo.org>
Thu, 9 Nov 2006 08:14:00 +0000 (08:14 -0000)
libpthread/linuxthreads.old/join.c

index f249a81..4bdc77a 100644 (file)
@@ -37,9 +37,13 @@ void __pthread_do_exit(void *retval, char *currentframe)
   struct pthread_request request;
   PDEBUG("self=%p, pid=%d\n", self, self->p_pid);
 
-  /* Reset the cancellation flag to avoid looping if the cleanup handlers
-     contain cancellation points */
-  THREAD_SETMEM(self, p_canceled, 0);
+  /* obey POSIX behavior and prevent cancellation functions from
+   * being called more than once.
+   * http://sourceware.org/ml/libc-ports/2006-10/msg00043.html
+   */
+  THREAD_SETMEM(self, p_cancelstate, PTHREAD_CANCEL_DISABLE);
+  THREAD_SETMEM(self, p_canceltype, PTHREAD_CANCEL_DEFERRED);
+
   /* Call cleanup functions and destroy the thread-specific data */
   __pthread_perform_cleanup(currentframe);
   __pthread_destroy_specifics();