summaryrefslogtreecommitdiffstats
path: root/cpukit/posix/src/nanosleep.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-11-16 16:39:43 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-11-23 12:52:06 +0100
commit125f248231c173a038ed9fc00832e0b3d221ad43 (patch)
tree3894553badc7582b0c460aec4d34955f23ea3e81 /cpukit/posix/src/nanosleep.c
parentscore: Robust thread dispatch (diff)
downloadrtems-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.c31
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 );