diff options
Diffstat (limited to 'c/src/exec/posix/src/setcanceltype.c')
-rw-r--r-- | c/src/exec/posix/src/setcanceltype.c | 23 |
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; } |