[rtems commit] score: Fix _CORE_ceiling_mutex_Set_priority()

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


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

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Tue Mar 23 15:34:26 2021 +0100

score: Fix _CORE_ceiling_mutex_Set_priority()

We have to use a second thread queue context to acquire and release the
thread wait lock.

Close #4356.

---

 cpukit/include/rtems/score/coremuteximpl.h | 14 ++++++++------
 cpukit/rtems/src/semsetpriority.c          |  3 +--
 2 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/cpukit/include/rtems/score/coremuteximpl.h b/cpukit/include/rtems/score/coremuteximpl.h
index 1f9682a..5114f33 100644
--- a/cpukit/include/rtems/score/coremuteximpl.h
+++ b/cpukit/include/rtems/score/coremuteximpl.h
@@ -357,12 +357,10 @@ _CORE_ceiling_mutex_Get_scheduler(
  *
  * @param[out] the_mutex The ceiling mutex to set the priority of.
  * @param priority_ceiling The new priority ceiling of the mutex.
- * @param queue_context The thread queue context.
  */
 RTEMS_INLINE_ROUTINE void _CORE_ceiling_mutex_Set_priority(
   CORE_ceiling_mutex_Control *the_mutex,
-  Priority_Control            priority_ceiling,
-  Thread_queue_Context       *queue_context
+  Priority_Control            priority_ceiling
 )
 {
   Thread_Control *owner;
@@ -370,15 +368,19 @@ RTEMS_INLINE_ROUTINE void _CORE_ceiling_mutex_Set_priority(
   owner = _CORE_mutex_Get_owner( &the_mutex->Recursive.Mutex );
 
   if ( owner != NULL ) {
-    _Thread_Wait_acquire( owner, queue_context );
+    Thread_queue_Context queue_context;
+
+    _Thread_queue_Context_initialize( &queue_context );
+    _Thread_queue_Context_clear_priority_updates( &queue_context );
+    _Thread_Wait_acquire_critical( owner, &queue_context );
     _Thread_Priority_change(
       owner,
       &the_mutex->Priority_ceiling,
       priority_ceiling,
       PRIORITY_GROUP_LAST,
-      queue_context
+      &queue_context
     );
-    _Thread_Wait_release( owner, queue_context );
+    _Thread_Wait_release_critical( owner, &queue_context );
   } else {
     the_mutex->Priority_ceiling.priority = priority_ceiling;
   }
diff --git a/cpukit/rtems/src/semsetpriority.c b/cpukit/rtems/src/semsetpriority.c
index adb0320..119dd85 100644
--- a/cpukit/rtems/src/semsetpriority.c
+++ b/cpukit/rtems/src/semsetpriority.c
@@ -85,8 +85,7 @@ static rtems_status_code _Semaphore_Set_priority(
       if ( sc == RTEMS_SUCCESSFUL && new_priority != RTEMS_CURRENT_PRIORITY ) {
         _CORE_ceiling_mutex_Set_priority(
           &the_semaphore->Core_control.Mutex,
-          core_priority,
-          queue_context
+          core_priority
         );
       }
 



More information about the vc mailing list