summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2015-11-24 15:58:26 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2015-11-24 16:00:14 +0100
commitf6a1ef9fdb9df6beea4251f4440f6db5c6a473b9 (patch)
tree7359a0b2c5a3e8e16da7facaaf46041fc4ef1462
parentbsp/altera-cyclone-v: Add fatal extension handler (diff)
downloadrtems-f6a1ef9fdb9df6beea4251f4440f6db5c6a473b9.tar.bz2
posix: Require struct _pthread_cleanup_context
This structure is available in Newlib since 2013-11-29 (Git commit a534dfd26e765047621acd0eda656ded886e7108).
-rw-r--r--cpukit/configure.ac2
-rw-r--r--cpukit/posix/include/rtems/posix/cancel.h14
-rw-r--r--cpukit/posix/include/rtems/posix/threadsup.h6
-rw-r--r--cpukit/posix/src/cancelrun.c39
-rw-r--r--cpukit/posix/src/cleanuppop.c62
-rw-r--r--cpukit/posix/src/cleanuppush.c49
-rw-r--r--cpukit/posix/src/pthread.c4
7 files changed, 1 insertions, 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 <pthread.h>])
+ AC_CHECK_TYPES([struct _pthread_cleanup_context],[],[AC_MSG_ERROR([struct _pthread_cleanup_context in <pthread.h> is mandatory])],[#include <pthread.h>])
])
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 <rtems/posix/threadsup.h>
-#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 <rtems/posix/cancel.h>
#include <rtems/posix/threadsup.h>
-#ifndef HAVE_STRUCT__PTHREAD_CLEANUP_CONTEXT
-
-#include <rtems/score/chainimpl.h>
-#include <rtems/score/isr.h>
-#include <rtems/score/wkspace.h>
-#include <rtems/posix/pthreadimpl.h>
-
-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 <rtems/score/threaddispatch.h>
#include <rtems/posix/threadsup.h>
-#ifndef HAVE_STRUCT__PTHREAD_CLEANUP_CONTEXT
-
-#include <rtems/score/chainimpl.h>
-#include <rtems/score/isr.h>
-#include <rtems/score/wkspace.h>
-#include <rtems/posix/cancel.h>
-#include <rtems/posix/pthreadimpl.h>
-
-/*
- * 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 <rtems/score/threaddispatch.h>
#include <rtems/posix/threadsup.h>
-#ifndef HAVE_STRUCT__PTHREAD_CLEANUP_CONTEXT
-
-#include <rtems/score/chainimpl.h>
-#include <rtems/score/isr.h>
-#include <rtems/score/wkspace.h>
-#include <rtems/posix/cancel.h>
-#include <rtems/posix/pthreadimpl.h>
-
-/*
- * 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