summaryrefslogtreecommitdiffstats
path: root/cpukit/posix/src/setcancelstate.c
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2002-07-05 18:13:18 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2002-07-05 18:13:18 +0000
commitf845e96e7beef7d6db35c80e0075dcb07a71dce3 (patch)
tree20e8b5d161afe8cff844b85b0b45611f8611f9c7 /cpukit/posix/src/setcancelstate.c
parent2002-07-05 Joel Sherrill <joel@OARcorp.com> (diff)
downloadrtems-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.c23
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;
}