diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2010-07-27 16:34:26 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2010-07-27 16:34:26 +0000 |
commit | 1102485cbbcb24b77d7e0e178ba8fbe51d919470 (patch) | |
tree | 17e78ba02bc40f3e6810bcbab5db9eb113a8c8ad /cpukit/posix/src/sigtimedwait.c | |
parent | 2010-07-27 Gedare Bloom <giddyup44@yahoo.com> (diff) | |
download | rtems-1102485cbbcb24b77d7e0e178ba8fbe51d919470.tar.bz2 |
2010-07-27 Vinu Rajashekhar <vinutheraj@gmail.com>
PR 1630/cpukit
* posix/src/psignalchecksignal.c, posix/src/sigtimedwait.c:
sigtimedwait() was not completely following the POSIX specification.
Diffstat (limited to 'cpukit/posix/src/sigtimedwait.c')
-rw-r--r-- | cpukit/posix/src/sigtimedwait.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/cpukit/posix/src/sigtimedwait.c b/cpukit/posix/src/sigtimedwait.c index 70b632b6de..41ebf88677 100644 --- a/cpukit/posix/src/sigtimedwait.c +++ b/cpukit/posix/src/sigtimedwait.c @@ -26,7 +26,7 @@ #include <rtems/posix/time.h> #include <rtems/score/isr.h> -int _POSIX_signals_Get_highest( +int _POSIX_signals_Get_lowest( sigset_t set ) { @@ -115,7 +115,7 @@ int sigtimedwait( _ISR_Disable( level ); if ( *set & api->signals_pending ) { /* XXX real info later */ - the_info->si_signo = _POSIX_signals_Get_highest( api->signals_pending ); + the_info->si_signo = _POSIX_signals_Get_lowest( api->signals_pending ); _POSIX_signals_Clear_signals( api, the_info->si_signo, @@ -133,7 +133,7 @@ int sigtimedwait( /* Process pending signals? */ if ( *set & _POSIX_signals_Pending ) { - signo = _POSIX_signals_Get_highest( _POSIX_signals_Pending ); + signo = _POSIX_signals_Get_lowest( _POSIX_signals_Pending ); _POSIX_signals_Clear_signals( api, signo, the_info, true, false ); _ISR_Enable( level ); @@ -161,6 +161,17 @@ int sigtimedwait( */ _POSIX_signals_Clear_signals( api, the_info->si_signo, the_info, false, false ); - errno = _Thread_Executing->Wait.return_code; + + /* Set errno only if return code is not EINTR or + * if EINTR was caused by a signal being caught, which + * was not in our set. + */ + + if ( (_Thread_Executing->Wait.return_code != EINTR) + || !(*set & signo_to_mask( the_info->si_signo )) ) { + errno = _Thread_Executing->Wait.return_code; + return -1; + } + return the_info->si_signo; } |