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/score/include/rtems/score/threadqimpl.h | 45 ++++++++++++++++++++------ 1 file changed, 35 insertions(+), 10 deletions(-) (limited to 'cpukit/score/include/rtems/score/threadqimpl.h') diff --git a/cpukit/score/include/rtems/score/threadqimpl.h b/cpukit/score/include/rtems/score/threadqimpl.h index 45f552a103..232e9601ac 100644 --- a/cpukit/score/include/rtems/score/threadqimpl.h +++ b/cpukit/score/include/rtems/score/threadqimpl.h @@ -61,6 +61,12 @@ typedef struct { Thread_queue_Queue Queue; } Thread_queue_Syslock_queue; +void _Thread_queue_Enqueue_do_nothing( + Thread_queue_Queue *queue, + Thread_Control *the_thread, + Thread_queue_Context *queue_context +); + /** * @brief Sets the thread wait return code to STATUS_DEADLOCK. */ @@ -82,7 +88,7 @@ RTEMS_INLINE_ROUTINE void _Thread_queue_Context_initialize( { #if defined(RTEMS_DEBUG) memset( queue_context, 0, sizeof( *queue_context ) ); - queue_context->expected_thread_dispatch_disable_level = 0xdeadbeef; + queue_context->enqueue_callout = _Thread_queue_Enqueue_do_nothing; queue_context->deadlock_callout = _Thread_queue_Deadlock_fatal; #else (void) queue_context; @@ -90,21 +96,35 @@ RTEMS_INLINE_ROUTINE void _Thread_queue_Context_initialize( } /** - * @brief Sets the expected thread dispatch disable level in the thread queue - * context. + * @brief Sets the enqueue callout in the thread queue context. * * @param queue_context The thread queue context. - * @param expected_level The expected thread dispatch disable level. + * @param enqueue_callout The enqueue callout. * * @see _Thread_queue_Enqueue_critical(). */ RTEMS_INLINE_ROUTINE void -_Thread_queue_Context_set_expected_level( - Thread_queue_Context *queue_context, - uint32_t expected_level +_Thread_queue_Context_set_enqueue_callout( + Thread_queue_Context *queue_context, + Thread_queue_Enqueue_callout enqueue_callout +) +{ + queue_context->enqueue_callout = enqueue_callout; +} + +/** + * @brief Sets the do nothing enqueue callout in the thread queue context. + * + * @param queue_context The thread queue context. + * + * @see _Thread_queue_Enqueue_critical(). + */ +RTEMS_INLINE_ROUTINE void +_Thread_queue_Context_set_do_nothing_enqueue_callout( + Thread_queue_Context *queue_context ) { - queue_context->expected_thread_dispatch_disable_level = expected_level; + queue_context->enqueue_callout = _Thread_queue_Enqueue_do_nothing; } /** @@ -562,7 +582,7 @@ Thread_Control *_Thread_queue_Do_dequeue( * mutex->owner = executing; * _Thread_queue_Release( &mutex->Queue, queue_context ); * } else { - * _Thread_queue_Context_set_expected_level( &queue_context, 1 ); + * _Thread_queue_Context_set_do_nothing_enqueue_callout( &queue_context ); * _Thread_queue_Enqueue_critical( * &mutex->Queue.Queue, * MUTEX_TQ_OPERATIONS, @@ -638,12 +658,17 @@ RTEMS_INLINE_ROUTINE void _Thread_queue_Enqueue( _Thread_queue_Context_initialize( &queue_context ); _Thread_queue_Acquire( the_thread_queue, &queue_context ); - _Thread_queue_Context_set_expected_level( &queue_context, expected_level ); + _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, timeout ); } else { _Thread_queue_Context_set_relative_timeout( &queue_context, timeout ); } + _Thread_queue_Enqueue_critical( &the_thread_queue->Queue, operations, -- cgit v1.2.3