Make sure calls to pthread_cancel() do not take effect if the target
thread is already exiting. PR: bin/37614 Reviewed by: deischen MFC after: 1 week
This commit is contained in:
parent
48f62c707a
commit
15e73cd042
@ -20,7 +20,8 @@ _pthread_cancel(pthread_t pthread)
|
||||
|
||||
if ((ret = _find_thread(pthread)) != 0) {
|
||||
/* NOTHING */
|
||||
} else if (pthread->state == PS_DEAD || pthread->state == PS_DEADLOCK) {
|
||||
} else if (pthread->state == PS_DEAD || pthread->state == PS_DEADLOCK
|
||||
|| (pthread->flags & PTHREAD_EXITING) != 0) {
|
||||
ret = 0;
|
||||
} else {
|
||||
/* Protect the scheduling queues: */
|
||||
@ -194,7 +195,8 @@ _pthread_testcancel(void)
|
||||
struct pthread *curthread = _get_curthread();
|
||||
|
||||
if (((curthread->cancelflags & PTHREAD_CANCEL_DISABLE) == 0) &&
|
||||
((curthread->cancelflags & PTHREAD_CANCELLING) != 0)) {
|
||||
((curthread->cancelflags & PTHREAD_CANCELLING) != 0) &&
|
||||
((curthread->flags & PTHREAD_EXITING) == 0)) {
|
||||
/*
|
||||
* It is possible for this thread to be swapped out
|
||||
* while performing cancellation; do not allow it
|
||||
|
@ -20,7 +20,8 @@ _pthread_cancel(pthread_t pthread)
|
||||
|
||||
if ((ret = _find_thread(pthread)) != 0) {
|
||||
/* NOTHING */
|
||||
} else if (pthread->state == PS_DEAD || pthread->state == PS_DEADLOCK) {
|
||||
} else if (pthread->state == PS_DEAD || pthread->state == PS_DEADLOCK
|
||||
|| (pthread->flags & PTHREAD_EXITING) != 0) {
|
||||
ret = 0;
|
||||
} else {
|
||||
/* Protect the scheduling queues: */
|
||||
@ -194,7 +195,8 @@ _pthread_testcancel(void)
|
||||
struct pthread *curthread = _get_curthread();
|
||||
|
||||
if (((curthread->cancelflags & PTHREAD_CANCEL_DISABLE) == 0) &&
|
||||
((curthread->cancelflags & PTHREAD_CANCELLING) != 0)) {
|
||||
((curthread->cancelflags & PTHREAD_CANCELLING) != 0) &&
|
||||
((curthread->flags & PTHREAD_EXITING) == 0)) {
|
||||
/*
|
||||
* It is possible for this thread to be swapped out
|
||||
* while performing cancellation; do not allow it
|
||||
|
@ -20,7 +20,8 @@ _pthread_cancel(pthread_t pthread)
|
||||
|
||||
if ((ret = _find_thread(pthread)) != 0) {
|
||||
/* NOTHING */
|
||||
} else if (pthread->state == PS_DEAD || pthread->state == PS_DEADLOCK) {
|
||||
} else if (pthread->state == PS_DEAD || pthread->state == PS_DEADLOCK
|
||||
|| (pthread->flags & PTHREAD_EXITING) != 0) {
|
||||
ret = 0;
|
||||
} else {
|
||||
/* Protect the scheduling queues: */
|
||||
@ -194,7 +195,8 @@ _pthread_testcancel(void)
|
||||
struct pthread *curthread = _get_curthread();
|
||||
|
||||
if (((curthread->cancelflags & PTHREAD_CANCEL_DISABLE) == 0) &&
|
||||
((curthread->cancelflags & PTHREAD_CANCELLING) != 0)) {
|
||||
((curthread->cancelflags & PTHREAD_CANCELLING) != 0) &&
|
||||
((curthread->flags & PTHREAD_EXITING) == 0)) {
|
||||
/*
|
||||
* It is possible for this thread to be swapped out
|
||||
* while performing cancellation; do not allow it
|
||||
|
Loading…
Reference in New Issue
Block a user