sched/semaphore: Optimize fast mutex acquire with CONFIG_PRIORITY_PROTECT or CONFIG_PRIORITY_INHERITANCE

When the semaphore priority flags is set to NONE, and the semaphore
is a mutex, the fast locking path can be used, even when
priority inheritance or priority protect are enabled globally.

Signed-off-by: Jukka Laitinen <jukka.laitinen@tii.ae>
This commit is contained in:
Jukka Laitinen 2025-03-21 08:23:31 +02:00 committed by Xiang Xiao
parent 504f838577
commit 73ee052b3f
3 changed files with 15 additions and 9 deletions

View file

@ -259,8 +259,11 @@ int nxsem_post(FAR sem_t *sem)
* else try to get it in slow mode.
*/
#if !defined(CONFIG_PRIORITY_INHERITANCE) && !defined(CONFIG_PRIORITY_PROTECT)
if (sem->flags & SEM_TYPE_MUTEX)
if ((sem->flags & SEM_TYPE_MUTEX)
#if defined(CONFIG_PRIORITY_PROTECT) || defined(CONFIG_PRIORITY_INHERITANCE)
&& (sem->flags & SEM_PRIO_MASK) == SEM_PRIO_NONE
#endif
)
{
int32_t old = 0;
if (atomic_try_cmpxchg_release(NXSEM_COUNT(sem), &old, 1))
@ -268,7 +271,6 @@ int nxsem_post(FAR sem_t *sem)
return OK;
}
}
#endif
return nxsem_post_slow(sem);
}

View file

@ -144,8 +144,11 @@ int nxsem_trywait(FAR sem_t *sem)
* else try to get it in slow mode.
*/
#if !defined(CONFIG_PRIORITY_INHERITANCE) && !defined(CONFIG_PRIORITY_PROTECT)
if (sem->flags & SEM_TYPE_MUTEX)
if ((sem->flags & SEM_TYPE_MUTEX)
#if defined(CONFIG_PRIORITY_PROTECT) || defined(CONFIG_PRIORITY_INHERITANCE)
&& (sem->flags & SEM_PRIO_MASK) == SEM_PRIO_NONE
#endif
)
{
int32_t old = 1;
if (atomic_try_cmpxchg_acquire(NXSEM_COUNT(sem), &old, 0))
@ -155,7 +158,6 @@ int nxsem_trywait(FAR sem_t *sem)
return -EAGAIN;
}
#endif
return nxsem_trywait_slow(sem);
}

View file

@ -265,8 +265,11 @@ int nxsem_wait(FAR sem_t *sem)
* else try to get it in slow mode.
*/
#if !defined(CONFIG_PRIORITY_INHERITANCE) && !defined(CONFIG_PRIORITY_PROTECT)
if (sem->flags & SEM_TYPE_MUTEX)
if ((sem->flags & SEM_TYPE_MUTEX)
#if defined(CONFIG_PRIORITY_PROTECT) || defined(CONFIG_PRIORITY_INHERITANCE)
&& (sem->flags & SEM_PRIO_MASK) == SEM_PRIO_NONE
#endif
)
{
int32_t old = 1;
if (atomic_try_cmpxchg_acquire(NXSEM_COUNT(sem), &old, 0))
@ -274,7 +277,6 @@ int nxsem_wait(FAR sem_t *sem)
return OK;
}
}
#endif
return nxsem_wait_slow(sem);
}