mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2025-12-25 22:07:15 +00:00
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.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user