summaryrefslogtreecommitdiffstats
path: root/cpukit/posix/include/rtems/posix/psignalimpl.h
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2013-08-26 17:39:00 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2013-08-27 12:51:46 +0200
commit7d9fff6e283e4adb114dee487a56f6e55a393a9e (patch)
tree8e87cc80bce58f41d2b4a37cd24ef3ddcbfeec17 /cpukit/posix/include/rtems/posix/psignalimpl.h
parentscore: Add SMP support to _Watchdog_Report_chain() (diff)
downloadrtems-7d9fff6e283e4adb114dee487a56f6e55a393a9e.tar.bz2
posix: Add and use _POSIX_signals_Acquire()
Add and use _POSIX_signals_Release(). The post-switch handler is not protected by disabled thread dispatching. Use proper SMP lock for signal management.
Diffstat (limited to 'cpukit/posix/include/rtems/posix/psignalimpl.h')
-rw-r--r--cpukit/posix/include/rtems/posix/psignalimpl.h12
1 files changed, 11 insertions, 1 deletions
diff --git a/cpukit/posix/include/rtems/posix/psignalimpl.h b/cpukit/posix/include/rtems/posix/psignalimpl.h
index 2dd1ed6739..c496fd33bd 100644
--- a/cpukit/posix/include/rtems/posix/psignalimpl.h
+++ b/cpukit/posix/include/rtems/posix/psignalimpl.h
@@ -32,6 +32,7 @@
#include <rtems/posix/pthread.h>
#include <rtems/posix/sigset.h>
#include <rtems/score/apiext.h>
+#include <rtems/score/isrlock.h>
#include <rtems/score/threadq.h>
#define _States_Is_interruptible_signal( _states ) \
@@ -54,6 +55,8 @@
* Variables
*/
+extern ISR_lock_Control _POSIX_signals_Lock;
+
extern sigset_t _POSIX_signals_Pending;
extern const struct sigaction _POSIX_signals_Default_vectors[ SIG_ARRAY_MAX ];
@@ -77,6 +80,12 @@ extern API_extensions_Post_switch_control _POSIX_signals_Post_switch;
*/
void _POSIX_signals_Manager_Initialization(void);
+#define _POSIX_signals_Acquire( level ) \
+ _ISR_lock_ISR_disable_and_acquire( &_POSIX_signals_Lock, level )
+
+#define _POSIX_signals_Release( level ) \
+ _ISR_lock_Release_and_ISR_enable( &_POSIX_signals_Lock, level )
+
static inline void _POSIX_signals_Add_post_switch_extension(void)
{
_API_extensions_Add_post_switch( &_POSIX_signals_Post_switch );
@@ -110,7 +119,8 @@ bool _POSIX_signals_Clear_signals(
int signo,
siginfo_t *info,
bool is_global,
- bool check_blocked
+ bool check_blocked,
+ bool do_signals_acquire_release
);
int killinfo(