diff options
author | Siddhesh Poyarekar <siddhesh@redhat.com> | 2012-05-15 09:41:27 +0530 |
---|---|---|
committer | Siddhesh Poyarekar <siddhesh@redhat.com> | 2012-05-15 09:41:57 +0530 |
commit | 439bf404b8fa125cf950dc1aa37838702c5353ea (patch) | |
tree | da5913033bcfa18987da0aabf69ad99b751772a3 /nptl/pthread_cancel.c | |
parent | Add x32 support to tcbhead_t (diff) | |
download | glibc-439bf404b8fa125cf950dc1aa37838702c5353ea.tar.gz glibc-439bf404b8fa125cf950dc1aa37838702c5353ea.tar.bz2 glibc-439bf404b8fa125cf950dc1aa37838702c5353ea.zip |
Allow a single-threaded program to cancel itself
There is nothing in the POSIX specification to disallow a
single-threaded program from cancelling itself, so we forcibly enable
multiple_threads to allow the next available cancellation point in the
thread to run.
Also added additional tests to cover various cancellation scenarios.
Diffstat (limited to 'nptl/pthread_cancel.c')
-rw-r--r-- | nptl/pthread_cancel.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/nptl/pthread_cancel.c b/nptl/pthread_cancel.c index 249aa1109a..1bfca63581 100644 --- a/nptl/pthread_cancel.c +++ b/nptl/pthread_cancel.c @@ -95,6 +95,14 @@ pthread_cancel (th) 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. */ + THREAD_SETMEM (THREAD_SELF, header.multiple_threads, 1); +#ifndef TLS_MULTIPLE_THREADS_IN_TCB + __pthread_multiple_threads = *__libc_multiple_threads_ptr = 1; +#endif } /* Mark the thread as canceled. This has to be done atomically since other bits could be modified as well. */ |