From 16b50ac63c994a0702f3ea585d639004c78995b6 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Fri, 16 Apr 2021 09:21:57 +0200 Subject: score: Always check if a prio ceiling is defined Priority ceiling semaphores (in contrast to MrsP semaphores) have only one priority ceiling which is defined for the home scheduler of the task which created the semaphore. Always check during a semaphore seize that the home scheduler of the calling task is equal to this scheduler. This avoids a scheduler mismatch if the semphore is acquired after the calling thread blocked on the semaphore. --- cpukit/include/rtems/score/coremuteximpl.h | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'cpukit/include/rtems') diff --git a/cpukit/include/rtems/score/coremuteximpl.h b/cpukit/include/rtems/score/coremuteximpl.h index 757efbde9b..1f9682a6b5 100644 --- a/cpukit/include/rtems/score/coremuteximpl.h +++ b/cpukit/include/rtems/score/coremuteximpl.h @@ -475,19 +475,19 @@ RTEMS_INLINE_ROUTINE Status_Control _CORE_ceiling_mutex_Seize( _CORE_mutex_Acquire_critical( &the_mutex->Recursive.Mutex, queue_context ); - owner = _CORE_mutex_Get_owner( &the_mutex->Recursive.Mutex ); - - if ( owner == NULL ) { #if defined(RTEMS_SMP) - if ( - _Thread_Scheduler_get_home( executing ) - != _CORE_ceiling_mutex_Get_scheduler( the_mutex ) - ) { - _CORE_mutex_Release( &the_mutex->Recursive.Mutex, queue_context ); - return STATUS_NOT_DEFINED; - } + if ( + _Thread_Scheduler_get_home( executing ) + != _CORE_ceiling_mutex_Get_scheduler( the_mutex ) + ) { + _CORE_mutex_Release( &the_mutex->Recursive.Mutex, queue_context ); + return STATUS_NOT_DEFINED; + } #endif + owner = _CORE_mutex_Get_owner( &the_mutex->Recursive.Mutex ); + + if ( owner == NULL ) { _Thread_queue_Context_clear_priority_updates( queue_context ); return _CORE_ceiling_mutex_Set_owner( the_mutex, -- cgit v1.2.3