From 125f248231c173a038ed9fc00832e0b3d221ad43 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Wed, 16 Nov 2016 16:39:43 +0100 Subject: 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. --- cpukit/posix/src/nanosleep.c | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) (limited to 'cpukit/posix/src/nanosleep.c') 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 ); -- cgit v1.2.3