This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[COMMITTED PATCH] NPTL: Conditionalize asynchronous cancellation support on [SIGCANCEL].
- From: Roland McGrath <roland at hack dot frob dot com>
- To: "GNU C. Library" <libc-alpha at sourceware dot org>
- Date: Thu, 20 Nov 2014 13:44:42 -0800 (PST)
- Subject: [COMMITTED PATCH] NPTL: Conditionalize asynchronous cancellation support on [SIGCANCEL].
- Authentication-results: sourceware.org; auth=none
Verified no generated code changes on x86_64-linux-gnu.
Thanks,
Roland
* 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.
--- 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;
--- 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)