summaryrefslogtreecommitdiffstats
path: root/c/src/exec/posix/src/setcancelstate.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/exec/posix/src/setcancelstate.c')
-rw-r--r--c/src/exec/posix/src/setcancelstate.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/c/src/exec/posix/src/setcancelstate.c b/c/src/exec/posix/src/setcancelstate.c
index 8a1df67c9d..4a2fb1f93f 100644
--- a/c/src/exec/posix/src/setcancelstate.c
+++ b/c/src/exec/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;
}