[rtems commit] score: Always check if a prio ceiling is defined

Sebastian Huber sebh at rtems.org
Mon Nov 15 11:38:59 UTC 2021


Module:    rtems
Branch:    master
Commit:    16b50ac63c994a0702f3ea585d639004c78995b6
Changeset: http://git.rtems.org/rtems/commit/?id=16b50ac63c994a0702f3ea585d639004c78995b6

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Fri Apr 16 09:21:57 2021 +0200

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

diff --git a/cpukit/include/rtems/score/coremuteximpl.h b/cpukit/include/rtems/score/coremuteximpl.h
index 757efbd..1f9682a 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,



More information about the vc mailing list