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(-)

diff --git a/cpukit/include/rtems/score/coremuteximpl.h 
b/cpukit/include/rtems/score/coremuteximpl.h
index cbc1e720fb..6b5c240105 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,
-- 
2.26.2

_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to