From f845e96e7beef7d6db35c80e0075dcb07a71dce3 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Fri, 5 Jul 2002 18:13:18 +0000 Subject: 2002-07-05 Joel Sherrill * 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. --- cpukit/posix/src/testcancel.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) (limited to 'cpukit/posix/src/testcancel.c') diff --git a/cpukit/posix/src/testcancel.c b/cpukit/posix/src/testcancel.c index b4007526de..08a423747f 100644 --- a/cpukit/posix/src/testcancel.c +++ b/cpukit/posix/src/testcancel.c @@ -27,9 +27,20 @@ void pthread_testcancel( void ) { 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; + thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ]; - if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE && - thread_support->cancelation_requested ) - _POSIX_Thread_cancel_run( _Thread_Executing ); + _Thread_Disable_dispatch(); + if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE && + thread_support->cancelation_requested ) + _POSIX_Threads_cancel_run( _Thread_Executing ); + _Thread_Enable_dispatch(); } -- cgit v1.2.3