Skip to content

Commit

Permalink
NPTL: Conditionalize asynchronous cancellation support on [SIGCANCEL].
Browse files Browse the repository at this point in the history
  • Loading branch information
Roland McGrath committed Nov 20, 2014
1 parent f214ff7 commit 2f531bb
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 7 deletions.
5 changes: 5 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -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.
Expand Down
17 changes: 13 additions & 4 deletions nptl/pthread_cancel.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>


Expand Down Expand Up @@ -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);
Expand All @@ -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;
Expand Down
9 changes: 6 additions & 3 deletions nptl/pthread_setcanceltype.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 2f531bb

Please sign in to comment.