From 73881cf61479dc555f5e61aded929990c8874bd1 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Tue, 23 Mar 2021 15:34:26 +0100 Subject: 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 6b5c240105..875bca4b78 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, false, - 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 adb0320210..119dd85d77 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 ); } -- cgit v1.2.3