summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2012-12-03 11:59:08 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2012-12-05 18:07:05 +0100
commit9465fca287e9417e05d2efe572d770fd60ad61db (patch)
tree4d5e71a3de2b27b6ddd637d1e2f031abe4bdf800
parentposix: Add and use <rtems/posix/psignalimpl.h> (diff)
downloadrtems-9465fca287e9417e05d2efe572d770fd60ad61db.tar.bz2
posix: Add signal post switch extension on the fly
-rw-r--r--cpukit/posix/include/rtems/posix/psignalimpl.h10
-rw-r--r--cpukit/posix/src/killinfo.c2
-rw-r--r--cpukit/posix/src/psignal.c6
-rw-r--r--cpukit/posix/src/pthread.c5
-rw-r--r--cpukit/posix/src/pthreadkill.c2
5 files changed, 16 insertions, 9 deletions
diff --git a/cpukit/posix/include/rtems/posix/psignalimpl.h b/cpukit/posix/include/rtems/posix/psignalimpl.h
index e61fe3f74b..6c46f3c49c 100644
--- a/cpukit/posix/include/rtems/posix/psignalimpl.h
+++ b/cpukit/posix/include/rtems/posix/psignalimpl.h
@@ -19,6 +19,7 @@
#include <rtems/posix/psignal.h>
#include <rtems/posix/pthread.h>
#include <rtems/posix/sigset.h>
+#include <rtems/score/apiext.h>
#define _States_Is_interruptible_signal( _states ) \
( ((_states) & \
@@ -56,15 +57,18 @@ extern Chain_Control _POSIX_signals_Inactive_siginfo;
extern Chain_Control _POSIX_signals_Siginfo[ SIG_ARRAY_MAX ];
+extern API_extensions_Post_switch_control _POSIX_signals_Post_switch;
+
/*
* Internal routines
*/
void _POSIX_signals_Manager_Initialization(void);
-void _POSIX_signals_Post_switch_extension(
- Thread_Control *the_thread
-);
+static inline void _POSIX_signals_Add_post_switch_extension(void)
+{
+ _API_extensions_Add_post_switch( &_POSIX_signals_Post_switch );
+}
bool _POSIX_signals_Unblock_thread(
Thread_Control *the_thread,
diff --git a/cpukit/posix/src/killinfo.c b/cpukit/posix/src/killinfo.c
index 59329ee49e..95a2459100 100644
--- a/cpukit/posix/src/killinfo.c
+++ b/cpukit/posix/src/killinfo.c
@@ -114,6 +114,8 @@ int killinfo(
_Thread_Disable_dispatch();
+ _POSIX_signals_Add_post_switch_extension();
+
/*
* Is the currently executing thread interested? If so then it will
* get it an execute it as soon as the dispatcher executes.
diff --git a/cpukit/posix/src/psignal.c b/cpukit/posix/src/psignal.c
index aa76d0dcc7..7623920f54 100644
--- a/cpukit/posix/src/psignal.c
+++ b/cpukit/posix/src/psignal.c
@@ -103,7 +103,7 @@ Watchdog_Control _POSIX_signals_Ualarm_timer;
* _POSIX_signals_Post_switch_extension
*/
-void _POSIX_signals_Post_switch_extension(
+static void _POSIX_signals_Post_switch_hook(
Thread_Control *the_thread
)
{
@@ -158,6 +158,10 @@ void _POSIX_signals_Post_switch_extension(
_Thread_Executing->Wait.return_code = hold_errno;
}
+API_extensions_Post_switch_control _POSIX_signals_Post_switch = {
+ .hook = _POSIX_signals_Post_switch_hook
+};
+
/*
* _POSIX_signals_Manager_Initialization
*/
diff --git a/cpukit/posix/src/pthread.c b/cpukit/posix/src/pthread.c
index 8923aebbb2..1773c24b69 100644
--- a/cpukit/posix/src/pthread.c
+++ b/cpukit/posix/src/pthread.c
@@ -311,10 +311,6 @@ API_extensions_Control _POSIX_Threads_API_extensions = {
.postdriver_hook = _POSIX_Threads_Initialize_user_threads
};
-API_extensions_Post_switch_control _POSIX_Threads_API_extensions_post_switch = {
- .hook = _POSIX_signals_Post_switch_extension
-};
-
User_extensions_Control _POSIX_Threads_User_extensions = {
{ NULL, NULL },
{ { NULL, NULL }, NULL },
@@ -359,7 +355,6 @@ void _POSIX_Threads_Manager_initialization(void)
_User_extensions_Add_API_set( &_POSIX_Threads_User_extensions );
_API_extensions_Add( &_POSIX_Threads_API_extensions );
- _API_extensions_Add_post_switch( &_POSIX_Threads_API_extensions_post_switch );
/*
* If we supported MP, then here we would ...
diff --git a/cpukit/posix/src/pthreadkill.c b/cpukit/posix/src/pthreadkill.c
index 0caaa2a22f..67ef0c7005 100644
--- a/cpukit/posix/src/pthreadkill.c
+++ b/cpukit/posix/src/pthreadkill.c
@@ -46,6 +46,8 @@ int pthread_kill(
* If sig == 0 then just validate arguments
*/
+ _POSIX_signals_Add_post_switch_extension();
+
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
if ( sig ) {