From aa05cfbb3d6309ec45b69f34d0870465fe30b74c Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Mon, 11 May 2015 14:56:49 +0200 Subject: score: Replace _Thread_Delay_ended() Use _Thread_Timeout() instead. Use pseudo thread queue for nanosleep() to deal with signals. Close #2130. --- cpukit/posix/src/nanosleep.c | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) (limited to 'cpukit/posix/src/nanosleep.c') diff --git a/cpukit/posix/src/nanosleep.c b/cpukit/posix/src/nanosleep.c index 39ae84d3e4..46697ae8fc 100644 --- a/cpukit/posix/src/nanosleep.c +++ b/cpukit/posix/src/nanosleep.c @@ -23,9 +23,13 @@ #include #include +#include #include #include +static Thread_queue_Control _Nanosleep_Pseudo_queue = + THREAD_QUEUE_FIFO_INITIALIZER( _Nanosleep_Pseudo_queue, "Nanosleep" ); + /* * 14.2.5 High Resolution Sleep, P1003.1b-1993, p. 269 */ @@ -38,7 +42,8 @@ int nanosleep( * It is critical to obtain the executing thread after thread dispatching is * disabled on SMP configurations. */ - Thread_Control *executing; + Thread_Control *executing; + Per_CPU_Control *cpu_self; Watchdog_Interval ticks; Watchdog_Interval elapsed; @@ -58,16 +63,17 @@ int nanosleep( */ ticks = _Timespec_To_ticks( rqtp ); + executing = _Thread_Get_executing(); + /* * A nanosleep for zero time is implemented as a yield. * This behavior is also beyond the POSIX specification but is * consistent with the RTEMS API and yields desirable behavior. */ if ( !ticks ) { - _Thread_Disable_dispatch(); - executing = _Thread_Executing; + cpu_self = _Thread_Dispatch_disable(); _Thread_Yield( executing ); - _Thread_Enable_dispatch(); + _Thread_Dispatch_enable( cpu_self ); if ( rmtp ) { rmtp->tv_sec = 0; rmtp->tv_nsec = 0; @@ -78,20 +84,13 @@ int nanosleep( /* * Block for the desired amount of time */ - _Thread_Disable_dispatch(); - executing = _Thread_Executing; - _Thread_Set_state( - executing, - STATES_DELAYING | STATES_INTERRUPTIBLE_BY_SIGNAL - ); - _Watchdog_Initialize( - &executing->Timer, - _Thread_Delay_ended, - 0, - executing - ); - _Watchdog_Insert_ticks( &executing->Timer, ticks ); - _Thread_Enable_dispatch(); + _Thread_queue_Enqueue( + &_Nanosleep_Pseudo_queue, + executing, + STATES_DELAYING | STATES_INTERRUPTIBLE_BY_SIGNAL, + ticks, + 0 + ); /* * Calculate the time that passed while we were sleeping and how -- cgit v1.2.3