mirror of
https://github.com/apache/nuttx.git
synced 2026-05-24 16:11:56 +08:00
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:
committed by
Xiang Xiao
parent
504f838577
commit
73ee052b3f
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user