diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-08-26 17:39:00 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-08-27 12:51:46 +0200 |
commit | 7d9fff6e283e4adb114dee487a56f6e55a393a9e (patch) | |
tree | 8e87cc80bce58f41d2b4a37cd24ef3ddcbfeec17 /cpukit/posix/src/sigtimedwait.c | |
parent | score: Add SMP support to _Watchdog_Report_chain() (diff) | |
download | rtems-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.c | 20 |
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 |