remove leftover cp_sp cruft from cancellation code, fix small bug
authorRich Felker <dalias@aerifal.cx>
Fri, 25 May 2012 04:35:09 +0000 (00:35 -0400)
committerRich Felker <dalias@aerifal.cx>
Fri, 25 May 2012 04:35:09 +0000 (00:35 -0400)
the bug was that cancellation requests which arrived while a
cancellation point was interrupted by a signal handler would not be
acted upon when the signal handler returns. this was because cp_sp was
never set; it's no longer needed or used.

instead, just always re-raise the signal when cancellation was not
acted upon. this wastes a tiny amount of time in the rare case where
it even matters, but it ensures correctness and simplifies the code.

src/thread/cancel_impl.c

index 3bf1e39..a164898 100644 (file)
@@ -3,7 +3,6 @@
 void __cancel()
 {
        pthread_t self = __pthread_self();
 void __cancel()
 {
        pthread_t self = __pthread_self();
-       self->cp_sp = 0;
        self->canceldisable = 1;
        self->cancelasync = 0;
        pthread_exit(PTHREAD_CANCELED);
        self->canceldisable = 1;
        self->cancelasync = 0;
        pthread_exit(PTHREAD_CANCELED);
@@ -48,8 +47,7 @@ static void cancel_handler(int sig, siginfo_t *si, void *ctx)
                __cancel();
        }
 
                __cancel();
        }
 
-       if (self->cp_sp)
-               __syscall(SYS_tgkill, self->pid, self->tid, SIGCANCEL);
+       __syscall(SYS_tgkill, self->pid, self->tid, SIGCANCEL);
 }
 
 void __testcancel()
 }
 
 void __testcancel()