OSDN Git Service

merge fixes from upstream (rev 1.10 -> 1.13)
authorMike Frysinger <vapier@gentoo.org>
Thu, 24 Aug 2006 23:47:02 +0000 (23:47 -0000)
committerMike Frysinger <vapier@gentoo.org>
Thu, 24 Aug 2006 23:47:02 +0000 (23:47 -0000)
libpthread/linuxthreads.old/cancel.c

index 1356348..f354c2a 100644 (file)
@@ -62,6 +62,7 @@ int pthread_cancel(pthread_t thread)
   int dorestart = 0;
   pthread_descr th;
   pthread_extricate_if *pextricate;
+  int already_canceled;
 
   __pthread_lock(&handle->h_lock, NULL);
   if (invalid_handle(handle, thread)) {
@@ -71,13 +72,15 @@ int pthread_cancel(pthread_t thread)
 
   th = handle->h_descr;
 
-  if (th->p_canceled) {
+  already_canceled = th->p_canceled;
+  th->p_canceled = 1;
+
+  if (th->p_cancelstate == PTHREAD_CANCEL_DISABLE || already_canceled) {
     __pthread_unlock(&handle->h_lock);
     return 0;
   }
 
   pextricate = th->p_extricate;
-  th->p_canceled = 1;
   pid = th->p_pid;
 
   /* If the thread has registered an extrication interface, then