diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-04-01 11:38:47 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-04-06 09:08:21 +0200 |
commit | 8f9658187a46f3c3ee3d7c7b68491fab5175a8fd (patch) | |
tree | c1887c2441887909201698b8d16b8cb2e8598188 /cpukit/score/src/coremutexsurrender.c | |
parent | score: Simplify _Thread_queue_Do_flush() (diff) | |
download | rtems-8f9658187a46f3c3ee3d7c7b68491fab5175a8fd.tar.bz2 |
score: Rework MP thread queue callout support
The thread queue implementation was heavily reworked to support SMP.
This broke the multiprocessing support of the thread queues. This is
fixed by this patch.
A thread proxy is unblocked due to three reasons
1) timeout,
2) request satisfaction, and
3) extraction.
In case 1) no MPCI message must be sent. This is ensured via the
_Thread_queue_MP_callout_do_nothing() callout set during
_Thread_MP_Allocate_proxy().
In case 2) and 3) an MPCI message must be sent. In case we interrupt
the blocking operation during _Thread_queue_Enqueue_critical(), then
this message must be sent by the blocking thread. For this the new
fields Thread_Proxy_control::thread_queue_callout and
Thread_Proxy_control::thread_queue_id are used.
Delete the individual API MP callout types and use
Thread_queue_MP_callout throughout. This type is only defined in
multiprocessing configurations. Prefix the multiprocessing parameters
with mp_ to ease code review. Multiprocessing specific parameters are
optional due to use of a similar macro pattern. There is no overhead
for non-multiprocessing configurations.
Diffstat (limited to '')
-rw-r--r-- | cpukit/score/src/coremutexsurrender.c | 46 |
1 files changed, 10 insertions, 36 deletions
diff --git a/cpukit/score/src/coremutexsurrender.c b/cpukit/score/src/coremutexsurrender.c index da21d4bfea..1858f9c311 100644 --- a/cpukit/score/src/coremutexsurrender.c +++ b/cpukit/score/src/coremutexsurrender.c @@ -68,33 +68,13 @@ CORE_MUTEX_STATUS_SUCCESSFUL #endif -/* - * _CORE_mutex_Surrender - * - * This routine frees a unit to the mutex. If a task was blocked waiting for - * a unit from this mutex, then that task will be readied and the unit - * given to that task. Otherwise, the unit will be returned to the mutex. - * - * Input parameters: - * the_mutex - the mutex to be flushed - * id - id of parent mutex - * api_mutex_mp_support - api dependent MP support actions - * - * Output parameters: - * CORE_MUTEX_STATUS_SUCCESSFUL - if successful - * core error code - if unsuccessful - */ - -CORE_mutex_Status _CORE_mutex_Surrender( - CORE_mutex_Control *the_mutex, +CORE_mutex_Status _CORE_mutex_Do_surrender( + CORE_mutex_Control *the_mutex, #if defined(RTEMS_MULTIPROCESSING) - Objects_Id id, - CORE_mutex_API_mp_support_callout api_mutex_mp_support, -#else - Objects_Id id RTEMS_UNUSED, - CORE_mutex_API_mp_support_callout api_mutex_mp_support RTEMS_UNUSED, + Thread_queue_MP_callout mp_callout, + Objects_Id mp_id, #endif - ISR_lock_Context *lock_context + ISR_lock_Context *lock_context ) { Thread_Control *the_thread; @@ -199,12 +179,12 @@ CORE_mutex_Status _CORE_mutex_Surrender( unblock = _Thread_queue_Extract_locked( &the_mutex->Wait_queue.Queue, the_mutex->operations, - the_thread + the_thread, + mp_callout, + mp_id ); #if defined(RTEMS_MULTIPROCESSING) - _Thread_Dispatch_disable(); - if ( _Objects_Is_local_id( the_thread->Object.id ) ) #endif { @@ -232,16 +212,10 @@ CORE_mutex_Status _CORE_mutex_Surrender( unblock, &the_mutex->Wait_queue.Queue, the_thread, + mp_callout, + mp_id, lock_context ); - -#if defined(RTEMS_MULTIPROCESSING) - if ( !_Objects_Is_local_id( the_thread->Object.id ) ) { - ( *api_mutex_mp_support)( the_thread, id ); - } - - _Thread_Dispatch_enable( _Per_CPU_Get() ); -#endif } else { _Thread_queue_Release( &the_mutex->Wait_queue, lock_context ); } |