summaryrefslogtreecommitdiffstats
path: root/c/src/exec/posix/src/setcanceltype.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/exec/posix/src/setcanceltype.c')
-rw-r--r--c/src/exec/posix/src/setcanceltype.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/c/src/exec/posix/src/setcanceltype.c b/c/src/exec/posix/src/setcanceltype.c
index ae8de273c4..aff7d84dda 100644
--- a/c/src/exec/posix/src/setcanceltype.c
+++ b/c/src/exec/posix/src/setcanceltype.c
@@ -30,6 +30,15 @@ int pthread_setcanceltype(
{
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 ( !oldtype )
return EINVAL;
@@ -38,13 +47,15 @@ int pthread_setcanceltype(
thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
- *oldtype = thread_support->cancelability_type;
- thread_support->cancelability_type = type;
+ _Thread_Disable_dispatch();
+ *oldtype = thread_support->cancelability_type;
+ thread_support->cancelability_type = type;
- 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;
}