diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-11-16 16:39:43 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-11-23 12:52:06 +0100 |
commit | 125f248231c173a038ed9fc00832e0b3d221ad43 (patch) | |
tree | 3894553badc7582b0c460aec4d34955f23ea3e81 /cpukit/posix/src/nanosleep.c | |
parent | score: Robust thread dispatch (diff) | |
download | rtems-125f248231c173a038ed9fc00832e0b3d221ad43.tar.bz2 |
score: Add thread queue enqueue callout
Replace the expected thread dispatch disable level with a thread queue
enqueue callout. This enables the use of _Thread_Dispatch_direct() in
the thread queue enqueue procedure. This avoids impossible exection
paths, e.g. Per_CPU_Control::dispatch_necessary is always true.
Diffstat (limited to 'cpukit/posix/src/nanosleep.c')
-rw-r--r-- | cpukit/posix/src/nanosleep.c | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/cpukit/posix/src/nanosleep.c b/cpukit/posix/src/nanosleep.c index 0fec1e48e1..8addc87c59 100644 --- a/cpukit/posix/src/nanosleep.c +++ b/cpukit/posix/src/nanosleep.c @@ -40,23 +40,34 @@ static inline int nanosleep_helper( Watchdog_Discipline discipline ) { - Thread_Control *executing; - struct timespec stop; - int err = 0; + Thread_queue_Context queue_context; + struct timespec stop; + int err; - executing = _Thread_Get_executing(); + err = 0; + + _Thread_queue_Context_initialize( &queue_context ); + _Thread_queue_Context_set_enqueue_callout( + &queue_context, + _Thread_queue_Enqueue_do_nothing + ); + + if ( discipline == WATCHDOG_ABSOLUTE ) { + _Thread_queue_Context_set_absolute_timeout( &queue_context, ticks ); + } else { + _Thread_queue_Context_set_relative_timeout( &queue_context, ticks ); + } /* * Block for the desired amount of time */ - _Thread_queue_Enqueue( - &_Nanosleep_Pseudo_queue, + _Thread_queue_Acquire( &_Nanosleep_Pseudo_queue, &queue_context ); + _Thread_queue_Enqueue_critical( + &_Nanosleep_Pseudo_queue.Queue, &_Thread_queue_Operations_FIFO, - executing, + _Thread_Executing, STATES_DELAYING | STATES_INTERRUPTIBLE_BY_SIGNAL, - ticks, - discipline, - 1 + &queue_context ); clock_gettime( clock_id, &stop ); |