summaryrefslogtreecommitdiffstats
path: root/cpukit/posix/src/sigtimedwait.c
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/src/sigtimedwait.c
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/src/sigtimedwait.c')
-rw-r--r--cpukit/posix/src/sigtimedwait.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/cpukit/posix/src/sigtimedwait.c b/cpukit/posix/src/sigtimedwait.c
index 65454ac7a3..a7fbc1f7d3 100644
--- a/cpukit/posix/src/sigtimedwait.c
+++ b/cpukit/posix/src/sigtimedwait.c
@@ -117,7 +117,7 @@ int sigtimedwait(
/* API signals pending? */
- _ISR_Disable( level );
+ _POSIX_signals_Acquire( level );
if ( *set & api->signals_pending ) {
/* XXX real info later */
the_info->si_signo = _POSIX_signals_Get_lowest( api->signals_pending );
@@ -126,9 +126,10 @@ int sigtimedwait(
the_info->si_signo,
the_info,
false,
+ false,
false
);
- _ISR_Enable( level );
+ _POSIX_signals_Release( level );
the_info->si_code = SI_USER;
the_info->si_value.sival_int = 0;
@@ -139,8 +140,8 @@ int sigtimedwait(
if ( *set & _POSIX_signals_Pending ) {
signo = _POSIX_signals_Get_lowest( _POSIX_signals_Pending );
- _POSIX_signals_Clear_signals( api, signo, the_info, true, false );
- _ISR_Enable( level );
+ _POSIX_signals_Clear_signals( api, signo, the_info, true, false, false );
+ _POSIX_signals_Release( level );
the_info->si_signo = signo;
the_info->si_code = SI_USER;
@@ -156,7 +157,7 @@ int sigtimedwait(
executing->Wait.option = *set;
executing->Wait.return_argument = the_info;
_Thread_queue_Enter_critical_section( &_POSIX_signals_Wait_queue );
- _ISR_Enable( level );
+ _POSIX_signals_Release( level );
_Thread_queue_Enqueue( &_POSIX_signals_Wait_queue, executing, interval );
_Thread_Enable_dispatch();
@@ -165,7 +166,14 @@ int sigtimedwait(
* the signal.
*/
- _POSIX_signals_Clear_signals( api, the_info->si_signo, the_info, false, false );
+ _POSIX_signals_Clear_signals(
+ api,
+ the_info->si_signo,
+ the_info,
+ false,
+ false,
+ true
+ );
/* Set errno only if return code is not EINTR or
* if EINTR was caused by a signal being caught, which