diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2002-07-05 18:13:18 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2002-07-05 18:13:18 +0000 |
commit | f845e96e7beef7d6db35c80e0075dcb07a71dce3 (patch) | |
tree | 20e8b5d161afe8cff844b85b0b45611f8611f9c7 /cpukit/posix/src/setcancelstate.c | |
parent | 2002-07-05 Joel Sherrill <joel@OARcorp.com> (diff) | |
download | rtems-f845e96e7beef7d6db35c80e0075dcb07a71dce3.tar.bz2 |
2002-07-05 Joel Sherrill <joel@OARcorp.com>
* include/rtems/posix/cancel.h, src/cancel.c, src/cancelrun.c,
src/mqueue.c, src/pthread.c, src/semaphore.c, src/setcancelstate.c,
src/setcanceltype.c, src/testcancel.c: Per PR164, corrected the
behavior of thread cancellation and did some cleanup as a side-effect.
Diffstat (limited to 'cpukit/posix/src/setcancelstate.c')
-rw-r--r-- | cpukit/posix/src/setcancelstate.c | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/cpukit/posix/src/setcancelstate.c b/cpukit/posix/src/setcancelstate.c index 8a1df67c9d..4a2fb1f93f 100644 --- a/cpukit/posix/src/setcancelstate.c +++ b/cpukit/posix/src/setcancelstate.c @@ -30,6 +30,15 @@ int pthread_setcancelstate( { POSIX_API_Control *thread_support; + /* + * Don't even think about deleting a resource from an ISR. + * Besides this request is supposed to be for _Thread_Executing + * and the ISR context is not a thread. + */ + + if ( _ISR_Is_in_progress() ) + return EPROTO; + if ( !oldstate ) return EINVAL; @@ -38,13 +47,15 @@ int pthread_setcancelstate( thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ]; - *oldstate = thread_support->cancelability_state; - thread_support->cancelability_state = state; + _Thread_Disable_dispatch(); + *oldstate = thread_support->cancelability_state; + thread_support->cancelability_state = state; - if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE && - thread_support->cancelability_type == PTHREAD_CANCEL_ASYNCHRONOUS && - thread_support->cancelation_requested ) - _POSIX_Thread_cancel_run( _Thread_Executing ); + if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE && + thread_support->cancelability_type == PTHREAD_CANCEL_ASYNCHRONOUS && + thread_support->cancelation_requested ) + _POSIX_Threads_cancel_run( _Thread_Executing ); + _Thread_Enable_dispatch(); return 0; } |