From 2f531bbb7b0458a303e8969f1e830467ca684443 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Thu, 20 Nov 2014 13:43:35 -0800 Subject: NPTL: Conditionalize asynchronous cancellation support on [SIGCANCEL]. --- nptl/pthread_cancel.c | 17 +++++++++++++---- nptl/pthread_setcanceltype.c | 9 ++++++--- 2 files changed, 19 insertions(+), 7 deletions(-) (limited to 'nptl') diff --git a/nptl/pthread_cancel.c b/nptl/pthread_cancel.c index aeba1ff823..5e645e46ed 100644 --- a/nptl/pthread_cancel.c +++ b/nptl/pthread_cancel.c @@ -18,8 +18,9 @@ #include #include +#include #include "pthreadP.h" -#include "atomic.h" +#include #include @@ -63,6 +64,7 @@ pthread_cancel (th) oldval)) goto again; +#ifdef SIGCANCEL /* The cancellation handler will take care of marking the thread as canceled. */ INTERNAL_SYSCALL_DECL (err); @@ -80,13 +82,20 @@ pthread_cancel (th) if (INTERNAL_SYSCALL_ERROR_P (val, err)) result = INTERNAL_SYSCALL_ERRNO (val, err); +#else + /* It should be impossible to get here at all, since + pthread_setcanceltype should never have allowed + PTHREAD_CANCEL_ASYNCHRONOUS to be set. */ + abort (); +#endif break; } - /* A single-threaded process should be able to kill itself, since there is - nothing in the POSIX specification that says that it cannot. So we set - multiple_threads to true so that cancellation points get executed. */ + /* A single-threaded process should be able to kill itself, since + there is nothing in the POSIX specification that says that it + cannot. So we set multiple_threads to true so that cancellation + points get executed. */ THREAD_SETMEM (THREAD_SELF, header.multiple_threads, 1); #ifndef TLS_MULTIPLE_THREADS_IN_TCB __pthread_multiple_threads = *__libc_multiple_threads_ptr = 1; diff --git a/nptl/pthread_setcanceltype.c b/nptl/pthread_setcanceltype.c index fb1631f0ab..32646dc759 100644 --- a/nptl/pthread_setcanceltype.c +++ b/nptl/pthread_setcanceltype.c @@ -26,12 +26,15 @@ __pthread_setcanceltype (type, oldtype) int type; int *oldtype; { - volatile struct pthread *self; - if (type < PTHREAD_CANCEL_DEFERRED || type > PTHREAD_CANCEL_ASYNCHRONOUS) return EINVAL; - self = THREAD_SELF; +#ifndef SIGCANCEL + if (type == PTHREAD_CANCEL_ASYNCHRONOUS) + return ENOTSUP; +#endif + + volatile struct pthread *self = THREAD_SELF; int oldval = THREAD_GETMEM (self, cancelhandling); while (1) -- cgit v1.2.3-70-g09d2