From 0e9d5b69cccac14f02f8370e1f75d3ac714a4350 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Tue, 24 May 2016 13:15:47 +0200 Subject: mpci: Fix thread queue flush method We must call the MP callout for proxies if we unblock them after a thread queue extraction. This was missing in _Thread_queue_Flush_critical(). Move thread remove timer and unblock code to new function _Thread_Remove_timer_and_unblock(). --- cpukit/score/include/rtems/score/threadimpl.h | 19 ++++++++ cpukit/score/include/rtems/score/threadqimpl.h | 60 +++++--------------------- 2 files changed, 30 insertions(+), 49 deletions(-) (limited to 'cpukit/score/include') diff --git a/cpukit/score/include/rtems/score/threadimpl.h b/cpukit/score/include/rtems/score/threadimpl.h index c2ed6eef7b..0802730832 100644 --- a/cpukit/score/include/rtems/score/threadimpl.h +++ b/cpukit/score/include/rtems/score/threadimpl.h @@ -1571,6 +1571,25 @@ RTEMS_INLINE_ROUTINE void _Thread_Timer_remove( Thread_Control *the_thread ) _ISR_lock_Release_and_ISR_enable( &the_thread->Timer.Lock, &lock_context ); } +RTEMS_INLINE_ROUTINE void _Thread_Remove_timer_and_unblock( + Thread_Control *the_thread, + Thread_queue_Queue *queue +) +{ + _Thread_Timer_remove( the_thread ); + +#if defined(RTEMS_MULTIPROCESSING) + if ( _Objects_Is_local_id( the_thread->Object.id ) ) { + _Thread_Unblock( the_thread ); + } else { + _Thread_queue_Unblock_proxy( queue, the_thread ); + } +#else + (void) queue; + _Thread_Unblock( the_thread ); +#endif +} + RTEMS_INLINE_ROUTINE void _Thread_Debug_set_real_processor( Thread_Control *the_thread, Per_CPU_Control *cpu diff --git a/cpukit/score/include/rtems/score/threadqimpl.h b/cpukit/score/include/rtems/score/threadqimpl.h index 5ce89e76f4..0c4e979a5e 100644 --- a/cpukit/score/include/rtems/score/threadqimpl.h +++ b/cpukit/score/include/rtems/score/threadqimpl.h @@ -407,17 +407,6 @@ bool _Thread_queue_Do_extract_locked( ) #endif -void _Thread_queue_Do_unblock_critical( - bool unblock, - Thread_queue_Queue *queue, - Thread_Control *the_thread, -#if defined(RTEMS_MULTIPROCESSING) - Thread_queue_MP_callout mp_callout, - Objects_Id mp_id, -#endif - ISR_lock_Context *lock_context -); - /** * @brief Unblocks the thread which was on the thread queue before. * @@ -430,46 +419,14 @@ void _Thread_queue_Do_unblock_critical( * _Thread_queue_Extract_locked(). * @param[in] queue The actual thread queue. * @param[in] the_thread The thread to extract. - * @param[in] mp_callout Callout to unblock the thread in case it is actually a - * thread proxy. This parameter is only used on multiprocessing - * configurations. - * @param[in] mp_id Object identifier of the object containing the thread - * queue. This parameter is only used on multiprocessing configurations. * @param[in] lock_context The lock context of the lock acquire. */ -#if defined(RTEMS_MULTIPROCESSING) - #define _Thread_queue_Unblock_critical( \ - unblock, \ - queue, \ - the_thread, \ - mp_callout, \ - mp_id, \ - lock_context \ - ) \ - _Thread_queue_Do_unblock_critical( \ - unblock, \ - queue, \ - the_thread, \ - mp_callout, \ - mp_id, \ - lock_context \ - ) -#else - #define _Thread_queue_Unblock_critical( \ - unblock, \ - queue, \ - the_thread, \ - mp_callout, \ - mp_id, \ - lock_context \ - ) \ - _Thread_queue_Do_unblock_critical( \ - unblock, \ - queue, \ - the_thread, \ - lock_context \ - ) -#endif +void _Thread_queue_Unblock_critical( + bool unblock, + Thread_queue_Queue *queue, + Thread_Control *the_thread, + ISR_lock_Context *lock_context +); void _Thread_queue_Do_extract_critical( Thread_queue_Queue *queue, @@ -831,6 +788,11 @@ void _Thread_queue_MP_callout_do_nothing( Thread_Control *the_proxy, Objects_Id mp_id ); + +void _Thread_queue_Unblock_proxy( + Thread_queue_Queue *queue, + Thread_Control *the_thread +); #endif extern const Thread_queue_Operations _Thread_queue_Operations_default; -- cgit v1.2.3