summaryrefslogtreecommitdiffstats
path: root/cpukit/posix/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/posix/src')
-rw-r--r--cpukit/posix/src/cancelrun.c50
-rw-r--r--cpukit/posix/src/cleanuppop.c44
-rw-r--r--cpukit/posix/src/cleanuppush.c79
-rw-r--r--cpukit/posix/src/pthread.c16
4 files changed, 72 insertions, 117 deletions
diff --git a/cpukit/posix/src/cancelrun.c b/cpukit/posix/src/cancelrun.c
deleted file mode 100644
index 3e93b3dd57..0000000000
--- a/cpukit/posix/src/cancelrun.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * @file
- *
- * @brief Executes a thread's cancellation handlers
- * @ingroup POSIXAPI
- */
-
-/*
- * COPYRIGHT (c) 1989-2008.
- * On-Line Applications Research Corporation (OAR).
- *
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://www.rtems.org/license/LICENSE.
- */
-
-#if HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <pthread.h>
-
-#include <rtems/score/thread.h>
-#include <rtems/score/threaddispatch.h>
-#include <rtems/posix/cancel.h>
-#include <rtems/posix/threadsup.h>
-
-void _POSIX_Threads_cancel_run(
- Thread_Control *the_thread
-)
-{
- struct _pthread_cleanup_context *context;
- POSIX_API_Control *thread_support;
-
- _Thread_Disable_dispatch();
-
- thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ];
- thread_support->cancelability_state = PTHREAD_CANCEL_DISABLE;
-
- context = thread_support->last_cleanup_context;
- thread_support->last_cleanup_context = NULL;
-
- _Thread_Enable_dispatch();
-
- while ( context != NULL ) {
- ( *context->_routine )( context->_arg );
-
- context = context->_previous;
- }
-}
diff --git a/cpukit/posix/src/cleanuppop.c b/cpukit/posix/src/cleanuppop.c
deleted file mode 100644
index 081c97af66..0000000000
--- a/cpukit/posix/src/cleanuppop.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * @file
- *
- * @brief Removes Routine from Top of Calling Thread's stack and Invoke it
- * @ingroup POSIXAPI
- */
-
-/*
- * COPYRIGHT (c) 1989-2008.
- * On-Line Applications Research Corporation (OAR).
- *
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://www.rtems.org/license/LICENSE.
- */
-
-#if HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <pthread.h>
-
-#include <rtems/score/thread.h>
-#include <rtems/score/threaddispatch.h>
-#include <rtems/posix/threadsup.h>
-
-void _pthread_cleanup_pop(
- struct _pthread_cleanup_context *context,
- int execute
-)
-{
- POSIX_API_Control *thread_support;
-
- if ( execute != 0 ) {
- ( *context->_routine )( context->_arg );
- }
-
- _Thread_Disable_dispatch();
-
- thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
- thread_support->last_cleanup_context = context->_previous;
-
- _Thread_Enable_dispatch();
-}
diff --git a/cpukit/posix/src/cleanuppush.c b/cpukit/posix/src/cleanuppush.c
index bf99b062bb..0e5545898d 100644
--- a/cpukit/posix/src/cleanuppush.c
+++ b/cpukit/posix/src/cleanuppush.c
@@ -1,7 +1,7 @@
/**
* @file
*
- * @brief Establishing Cancellation Handlers
+ * @brief POSIX Cleanup Support
* @ingroup POSIXAPI
*/
@@ -20,9 +20,10 @@
#include <pthread.h>
+#include <rtems/sysinit.h>
#include <rtems/score/thread.h>
#include <rtems/score/threaddispatch.h>
-#include <rtems/posix/threadsup.h>
+#include <rtems/score/userextimpl.h>
void _pthread_cleanup_push(
struct _pthread_cleanup_context *context,
@@ -30,7 +31,8 @@ void _pthread_cleanup_push(
void *arg
)
{
- POSIX_API_Control *thread_support;
+ Per_CPU_Control *cpu_self;
+ Thread_Control *executing;
context->_routine = routine;
context->_arg = arg;
@@ -38,11 +40,72 @@ void _pthread_cleanup_push(
/* This value is unused, just provide a deterministic value */
context->_canceltype = -1;
- _Thread_Disable_dispatch();
+ cpu_self = _Thread_Dispatch_disable();
- thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
- context->_previous = thread_support->last_cleanup_context;
- thread_support->last_cleanup_context = context;
+ executing = _Per_CPU_Get_executing( cpu_self );
+ context->_previous = executing->last_cleanup_context;
+ executing->last_cleanup_context = context;
- _Thread_Enable_dispatch();
+ _Thread_Dispatch_enable( cpu_self );
}
+
+void _pthread_cleanup_pop(
+ struct _pthread_cleanup_context *context,
+ int execute
+)
+{
+ Per_CPU_Control *cpu_self;
+ Thread_Control *executing;
+
+ if ( execute != 0 ) {
+ ( *context->_routine )( context->_arg );
+ }
+
+ cpu_self = _Thread_Dispatch_disable();
+
+ executing = _Per_CPU_Get_executing( cpu_self );
+ executing->last_cleanup_context = context->_previous;
+
+ _Thread_Dispatch_enable( cpu_self );
+}
+
+static void _POSIX_Cleanup_terminate_extension( Thread_Control *the_thread )
+{
+ struct _pthread_cleanup_context *context;
+
+ context = the_thread->last_cleanup_context;
+ the_thread->last_cleanup_context = NULL;
+
+ while ( context != NULL ) {
+ ( *context->_routine )( context->_arg );
+
+ context = context->_previous;
+ }
+}
+
+static void _POSIX_Cleanup_restart_extension(
+ Thread_Control *executing,
+ Thread_Control *the_thread
+)
+{
+ (void) executing;
+ _POSIX_Cleanup_terminate_extension( the_thread );
+}
+
+static User_extensions_Control _POSIX_Cleanup_extensions = {
+ .Callouts = {
+ .thread_restart = _POSIX_Cleanup_restart_extension,
+ .thread_terminate = _POSIX_Cleanup_terminate_extension
+ }
+};
+
+static void _POSIX_Cleanup_initialization( void )
+{
+ _User_extensions_Add_API_set( &_POSIX_Cleanup_extensions );
+}
+
+RTEMS_SYSINIT_ITEM(
+ _POSIX_Cleanup_initialization,
+ RTEMS_SYSINIT_POSIX_CLEANUP,
+ RTEMS_SYSINIT_ORDER_MIDDLE
+);
diff --git a/cpukit/posix/src/pthread.c b/cpukit/posix/src/pthread.c
index 691dfc3161..6c4ea5ca8a 100644
--- a/cpukit/posix/src/pthread.c
+++ b/cpukit/posix/src/pthread.c
@@ -240,15 +240,6 @@ static bool _POSIX_Threads_Create_extension(
return true;
}
-static void _POSIX_Threads_Restart_extension(
- Thread_Control *executing,
- Thread_Control *restarted
-)
-{
- (void) executing;
- _POSIX_Threads_cancel_run( restarted );
-}
-
static void _POSIX_Threads_Terminate_extension(
Thread_Control *executing
)
@@ -259,11 +250,6 @@ static void _POSIX_Threads_Terminate_extension(
api = executing->API_Extensions[ THREAD_API_POSIX ];
- /*
- * Run the POSIX cancellation handlers
- */
- _POSIX_Threads_cancel_run( executing );
-
_Thread_Disable_dispatch();
/*
@@ -326,7 +312,7 @@ User_extensions_Control _POSIX_Threads_User_extensions = {
{ { NULL, NULL }, NULL },
{ _POSIX_Threads_Create_extension, /* create */
NULL, /* start */
- _POSIX_Threads_Restart_extension, /* restart */
+ NULL, /* restart */
NULL, /* delete */
NULL, /* switch */
NULL, /* begin */