diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-10-31 13:05:55 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-10-31 13:09:50 +0100 |
commit | 3e9f4c9232277079d11814e55af9bed11106bd04 (patch) | |
tree | d2fdca46cd602c526dc553993f2cf5cd33e3facc /cpukit/posix/src/sigtimedwait.c | |
parent | smptests/smplock01: Use test support (diff) | |
download | rtems-3e9f4c9232277079d11814e55af9bed11106bd04.tar.bz2 |
posix: Fix timeout handling in sigtimedwait()
Update #2798.
Diffstat (limited to '')
-rw-r--r-- | cpukit/posix/src/sigtimedwait.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/cpukit/posix/src/sigtimedwait.c b/cpukit/posix/src/sigtimedwait.c index 0e8518ed75..b85d48e909 100644 --- a/cpukit/posix/src/sigtimedwait.c +++ b/cpukit/posix/src/sigtimedwait.c @@ -71,7 +71,6 @@ int sigtimedwait( { Thread_Control *executing; POSIX_API_Control *api; - Watchdog_Interval interval; siginfo_t signal_information; siginfo_t *the_info; int signo; @@ -84,12 +83,14 @@ int sigtimedwait( if ( !set ) rtems_set_errno_and_return_minus_one( EINVAL ); + _Thread_queue_Context_initialize( &queue_context ); + /* NOTE: This is very specifically a RELATIVE not ABSOLUTE time * in the Open Group specification. */ - interval = 0; if ( timeout ) { + Watchdog_Interval interval; if ( !_Timespec_Is_valid( timeout ) ) rtems_set_errno_and_return_minus_one( EINVAL ); @@ -98,6 +99,10 @@ int sigtimedwait( if ( !interval ) rtems_set_errno_and_return_minus_one( EINVAL ); + + _Thread_queue_Context_set_relative_timeout( &queue_context, interval ); + } else { + _Thread_queue_Context_set_no_timeout( &queue_context ); } /* @@ -115,7 +120,6 @@ int sigtimedwait( /* API signals pending? */ - _Thread_queue_Context_initialize( &queue_context ); _POSIX_signals_Acquire( &queue_context ); if ( *set & api->signals_pending ) { /* XXX real info later */ @@ -153,7 +157,6 @@ int sigtimedwait( executing->Wait.option = *set; executing->Wait.return_argument = the_info; _Thread_queue_Context_set_expected_level( &queue_context, 1 ); - _Thread_queue_Context_set_relative_timeout( &queue_context, interval ); _Thread_queue_Enqueue_critical( &_POSIX_signals_Wait_queue.Queue, POSIX_SIGNALS_TQ_OPERATIONS, |