From f6a1ef9fdb9df6beea4251f4440f6db5c6a473b9 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Tue, 24 Nov 2015 15:58:26 +0100 Subject: posix: Require struct _pthread_cleanup_context This structure is available in Newlib since 2013-11-29 (Git commit a534dfd26e765047621acd0eda656ded886e7108). --- cpukit/configure.ac | 2 +- cpukit/posix/include/rtems/posix/cancel.h | 14 ------- cpukit/posix/include/rtems/posix/threadsup.h | 6 --- cpukit/posix/src/cancelrun.c | 39 ----------------- cpukit/posix/src/cleanuppop.c | 62 ---------------------------- cpukit/posix/src/cleanuppush.c | 49 ---------------------- cpukit/posix/src/pthread.c | 4 -- 7 files changed, 1 insertion(+), 175 deletions(-) diff --git a/cpukit/configure.ac b/cpukit/configure.ac index bf01ba0f7c..cdf9915904 100644 --- a/cpukit/configure.ac +++ b/cpukit/configure.ac @@ -173,7 +173,7 @@ AC_CHECK_HEADER([pthread.h],[ AC_CHECK_TYPES([pthread_rwlock_t]) AC_CHECK_TYPES([pthread_barrier_t]) AC_CHECK_TYPES([pthread_spinlock_t]) - AC_CHECK_TYPES([struct _pthread_cleanup_context],[],[],[#include ]) + AC_CHECK_TYPES([struct _pthread_cleanup_context],[],[AC_MSG_ERROR([struct _pthread_cleanup_context in is mandatory])],[#include ]) ]) AC_CHECK_HEADER([signal.h],[ diff --git a/cpukit/posix/include/rtems/posix/cancel.h b/cpukit/posix/include/rtems/posix/cancel.h index fd066e9175..9e60c269ce 100644 --- a/cpukit/posix/include/rtems/posix/cancel.h +++ b/cpukit/posix/include/rtems/posix/cancel.h @@ -21,20 +21,6 @@ #include -#ifndef HAVE_STRUCT__PTHREAD_CLEANUP_CONTEXT -/** - * This structure is used to manage the cancelation handlers. - */ -typedef struct { - /** This field is the Chain Node so we can put these on lists. */ - Chain_Node Node; - /** This field is the cancelation routine. */ - void (*routine)( void * ); - /** This field is the argument to the cancelation routine. */ - void *arg; -} POSIX_Cancel_Handler_control; -#endif /* HAVE_STRUCT__PTHREAD_CLEANUP_CONTEXT */ - /** * @brief POSIX run thread cancelation. * diff --git a/cpukit/posix/include/rtems/posix/threadsup.h b/cpukit/posix/include/rtems/posix/threadsup.h index 46903fed98..ae122962bc 100644 --- a/cpukit/posix/include/rtems/posix/threadsup.h +++ b/cpukit/posix/include/rtems/posix/threadsup.h @@ -85,16 +85,10 @@ typedef struct { int cancelability_type; /** This indicates if a cancelation has been requested. */ int cancelation_requested; -#ifndef HAVE_STRUCT__PTHREAD_CLEANUP_CONTEXT - /** This is the set of cancelation handlers. */ - Chain_Control Cancellation_Handlers; -#else /* HAVE_STRUCT__PTHREAD_CLEANUP_CONTEXT */ /** * @brief LIFO list of cleanup contexts. */ struct _pthread_cleanup_context *last_cleanup_context; -#endif /* HAVE_STRUCT__PTHREAD_CLEANUP_CONTEXT */ - } POSIX_API_Control; /** diff --git a/cpukit/posix/src/cancelrun.c b/cpukit/posix/src/cancelrun.c index caa7967594..3e93b3dd57 100644 --- a/cpukit/posix/src/cancelrun.c +++ b/cpukit/posix/src/cancelrun.c @@ -25,43 +25,6 @@ #include #include -#ifndef HAVE_STRUCT__PTHREAD_CLEANUP_CONTEXT - -#include -#include -#include -#include - -void _POSIX_Threads_cancel_run( - Thread_Control *the_thread -) -{ - POSIX_Cancel_Handler_control *handler; - Chain_Control *handler_stack; - POSIX_API_Control *thread_support; - ISR_Level level; - - thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ]; - - handler_stack = &thread_support->Cancellation_Handlers; - - thread_support->cancelability_state = PTHREAD_CANCEL_DISABLE; - - while ( !_Chain_Is_empty( handler_stack ) ) { - _ISR_Disable( level ); - handler = (POSIX_Cancel_Handler_control *) - _Chain_Tail( handler_stack )->previous; - _Chain_Extract_unprotected( &handler->Node ); - _ISR_Enable( level ); - - (*handler->routine)( handler->arg ); - - _Workspace_Free( handler ); - } -} - -#else /* HAVE_STRUCT__PTHREAD_CLEANUP_CONTEXT */ - void _POSIX_Threads_cancel_run( Thread_Control *the_thread ) @@ -85,5 +48,3 @@ void _POSIX_Threads_cancel_run( context = context->_previous; } } - -#endif /* HAVE_STRUCT__PTHREAD_CLEANUP_CONTEXT */ diff --git a/cpukit/posix/src/cleanuppop.c b/cpukit/posix/src/cleanuppop.c index e8ddc388bd..081c97af66 100644 --- a/cpukit/posix/src/cleanuppop.c +++ b/cpukit/posix/src/cleanuppop.c @@ -24,66 +24,6 @@ #include #include -#ifndef HAVE_STRUCT__PTHREAD_CLEANUP_CONTEXT - -#include -#include -#include -#include -#include - -/* - * 18.2.3.1 Establishing Cancellation Handlers, P1003.1c/Draft 10, p. 184 - */ - -void pthread_cleanup_pop( - int execute -) -{ - POSIX_Cancel_Handler_control *handler; - POSIX_Cancel_Handler_control tmp_handler; - Chain_Control *handler_stack; - POSIX_API_Control *thread_support; - ISR_Level level; - - thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ]; - - handler_stack = &thread_support->Cancellation_Handlers; - - /* - * We need interrupts disabled to safely check the chain and pull - * the last element off. But we also need dispatching disabled to - * ensure that we do not get prempted and deleted while we are holding - * memory that needs to be freed. - */ - - _Thread_Disable_dispatch(); - _ISR_Disable( level ); - - if ( _Chain_Is_empty( handler_stack ) ) { - _Thread_Enable_dispatch(); - _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; - - _Workspace_Free( handler ); - - _Thread_Enable_dispatch(); - - if ( execute ) - (*tmp_handler.routine)( tmp_handler.arg ); -} - -#else /* HAVE_STRUCT__PTHREAD_CLEANUP_CONTEXT */ - void _pthread_cleanup_pop( struct _pthread_cleanup_context *context, int execute @@ -102,5 +42,3 @@ void _pthread_cleanup_pop( _Thread_Enable_dispatch(); } - -#endif /* HAVE_STRUCT__PTHREAD_CLEANUP_CONTEXT */ diff --git a/cpukit/posix/src/cleanuppush.c b/cpukit/posix/src/cleanuppush.c index cf640e0477..bf99b062bb 100644 --- a/cpukit/posix/src/cleanuppush.c +++ b/cpukit/posix/src/cleanuppush.c @@ -24,53 +24,6 @@ #include #include -#ifndef HAVE_STRUCT__PTHREAD_CLEANUP_CONTEXT - -#include -#include -#include -#include -#include - -/* - * 18.2.3.1 Establishing Cancellation Handlers, P1003.1c/Draft 10, p. 184 - */ - -void pthread_cleanup_push( - void (*routine)( void * ), - void *arg -) -{ - POSIX_Cancel_Handler_control *handler; - Chain_Control *handler_stack; - POSIX_API_Control *thread_support; - - /* - * The POSIX standard does not address what to do when the routine - * is NULL. It also does not address what happens when we cannot - * allocate memory or anything else bad happens. - */ - if ( !routine ) - return; - - _Thread_Disable_dispatch(); - handler = _Workspace_Allocate( sizeof( POSIX_Cancel_Handler_control ) ); - - if ( handler ) { - thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ]; - - handler_stack = &thread_support->Cancellation_Handlers; - - handler->routine = routine; - handler->arg = arg; - - _Chain_Append( handler_stack, &handler->Node ); - } - _Thread_Enable_dispatch(); -} - -#else /* HAVE_STRUCT__PTHREAD_CLEANUP_CONTEXT */ - void _pthread_cleanup_push( struct _pthread_cleanup_context *context, void ( *routine )( void * ), @@ -93,5 +46,3 @@ void _pthread_cleanup_push( _Thread_Enable_dispatch(); } - -#endif /* HAVE_STRUCT__PTHREAD_CLEANUP_CONTEXT */ diff --git a/cpukit/posix/src/pthread.c b/cpukit/posix/src/pthread.c index 0fbe43338a..da0cf48a0c 100644 --- a/cpukit/posix/src/pthread.c +++ b/cpukit/posix/src/pthread.c @@ -209,11 +209,7 @@ static bool _POSIX_Threads_Create_extension( api->cancelation_requested = 0; api->cancelability_state = PTHREAD_CANCEL_ENABLE; api->cancelability_type = PTHREAD_CANCEL_DEFERRED; -#ifndef HAVE_STRUCT__PTHREAD_CLEANUP_CONTEXT - _Chain_Initialize_empty (&api->Cancellation_Handlers); -#else /* HAVE_STRUCT__PTHREAD_CLEANUP_CONTEXT */ api->last_cleanup_context = NULL; -#endif /* HAVE_STRUCT__PTHREAD_CLEANUP_CONTEXT */ /* * If the thread is not a posix thread, then all posix signals are blocked -- cgit v1.2.3