[rtems commit] posix: Require struct _pthread_cleanup_context

Sebastian Huber sebh at rtems.org
Wed Nov 25 07:33:10 UTC 2015


Module:    rtems
Branch:    master
Commit:    f6a1ef9fdb9df6beea4251f4440f6db5c6a473b9
Changeset: http://git.rtems.org/rtems/commit/?id=f6a1ef9fdb9df6beea4251f4440f6db5c6a473b9

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Tue Nov 24 15:58:26 2015 +0100

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 bf01ba0..cdf9915 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 fd066e9..9e60c26 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 46903fe..ae12296 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 caa7967..3e93b3d 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 e8ddc38..081c97a 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 cf640e0..bf99b06 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 0fbe433..da0cf48 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



More information about the vc mailing list