From 17f1ffbe0f75563ac96cbe541cc5afb38c5d9b6a Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Mon, 13 Oct 2003 21:37:54 +0000 Subject: 2003-10-13 Joel Sherrill * src/cleanuppop.c, src/cleanuppush.c: Protect use of _Workspace_Allocate and _Workspec_Free. --- cpukit/posix/ChangeLog | 5 +++++ cpukit/posix/src/cleanuppop.c | 20 ++++++++++++++------ cpukit/posix/src/cleanuppush.c | 7 ++++++- 3 files changed, 25 insertions(+), 7 deletions(-) (limited to 'cpukit/posix') diff --git a/cpukit/posix/ChangeLog b/cpukit/posix/ChangeLog index 5112c22d15..4aa6e520ac 100644 --- a/cpukit/posix/ChangeLog +++ b/cpukit/posix/ChangeLog @@ -1,3 +1,8 @@ +2003-10-13 Joel Sherrill + + * src/cleanuppop.c, src/cleanuppush.c: Protect use of + _Workspace_Allocate and _Workspec_Free. + 2003-09-04 Joel Sherrill * include/rtems/posix/cond.h, include/rtems/posix/condmp.h, diff --git a/cpukit/posix/src/cleanuppop.c b/cpukit/posix/src/cleanuppop.c index f477d1f0c8..d7a4c0ca11 100644 --- a/cpukit/posix/src/cleanuppop.c +++ b/cpukit/posix/src/cleanuppop.c @@ -28,6 +28,7 @@ void pthread_cleanup_pop( ) { POSIX_Cancel_Handler_control *handler; + POSIX_Cancel_Handler_control tmp_handler; Chain_Control *handler_stack; POSIX_API_Control *thread_support; ISR_Level level; @@ -36,17 +37,24 @@ void pthread_cleanup_pop( handler_stack = &thread_support->Cancellation_Handlers; - if ( _Chain_Is_empty( handler_stack ) ) - return; - _ISR_Disable( level ); + if ( _Chain_Is_empty( handler_stack ) ) { + _ISR_Enable( level ); + return; + } + handler = (POSIX_Cancel_Handler_control *) _Chain_Tail( handler_stack )->previous; _Chain_Extract_unprotected( &handler->Node ); + _ISR_Enable( level ); + tmp_handler = *handler; + + _Thread_Disable_dispatch(); + _Workspace_Free( handler ); + _Thread_Enable_dispatch(); + if ( execute ) - (*handler->routine)( handler->arg ); - - _Workspace_Free( handler ); + (*tmp_handler.routine)( tmp_handler.arg ); } diff --git a/cpukit/posix/src/cleanuppush.c b/cpukit/posix/src/cleanuppush.c index bf96212d8f..80193749e6 100644 --- a/cpukit/posix/src/cleanuppush.c +++ b/cpukit/posix/src/cleanuppush.c @@ -35,10 +35,13 @@ void pthread_cleanup_push( if ( !routine ) return; /* XXX what to do really? */ + _Thread_Disable_dispatch(); handler = _Workspace_Allocate( sizeof( POSIX_Cancel_Handler_control ) ); - if ( !handler ) + if ( !handler ) { + _Thread_Enable_dispatch(); return; /* XXX what to do really? */ + } thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ]; @@ -48,4 +51,6 @@ void pthread_cleanup_push( handler->arg = arg; _Chain_Append( handler_stack, &handler->Node ); + + _Thread_Enable_dispatch(); } -- cgit v1.2.3