diff options
author | Roland McGrath <roland@hack.frob.com> | 2014-11-20 13:43:35 -0800 |
---|---|---|
committer | Roland McGrath <roland@hack.frob.com> | 2014-11-20 13:43:35 -0800 |
commit | 2f531bbb7b0458a303e8969f1e830467ca684443 (patch) | |
tree | 28b2c5b70b7b886e4b910edd3cfe6b1d19fdba34 | |
parent | f214ff74f46275f6f1187730ac88b8a2407393f3 (diff) | |
download | glibc-2f531bbb7b0458a303e8969f1e830467ca684443.tar.gz glibc-2f531bbb7b0458a303e8969f1e830467ca684443.tar.xz glibc-2f531bbb7b0458a303e8969f1e830467ca684443.zip |
NPTL: Conditionalize asynchronous cancellation support on [SIGCANCEL].
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | nptl/pthread_cancel.c | 17 | ||||
-rw-r--r-- | nptl/pthread_setcanceltype.c | 9 |
3 files changed, 24 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog index 23c2244fff..d6a7c77059 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2014-11-20 Roland McGrath <roland@hack.frob.com> + * nptl/pthread_setcanceltype.c [!SIGCANCEL]: Return ENOTSUP early for + PTHREAD_CANCEL_ASYNCHRONOUS. + * nptl/pthread_cancel.c [!SIGCANCEL]: Just abort rather than trying to + send SIGCANCEL. + * nptl/default-sched.h: New file. * sysdeps/unix/sysv/linux/default-sched.h: New file. * nptl/pthread_create.c: Include it. 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 <errno.h> #include <signal.h> +#include <stdlib.h> #include "pthreadP.h" -#include "atomic.h" +#include <atomic.h> #include <sysdep.h> @@ -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) |