mirror of
https://github.com/apache/nuttx.git
synced 2026-05-26 18:56:10 +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.
|
* 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;
|
int32_t old = 0;
|
||||||
if (atomic_try_cmpxchg_release(NXSEM_COUNT(sem), &old, 1))
|
if (atomic_try_cmpxchg_release(NXSEM_COUNT(sem), &old, 1))
|
||||||
@@ -268,7 +271,6 @@ int nxsem_post(FAR sem_t *sem)
|
|||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
return nxsem_post_slow(sem);
|
return nxsem_post_slow(sem);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -144,8 +144,11 @@ int nxsem_trywait(FAR sem_t *sem)
|
|||||||
* else try to get it in slow mode.
|
* 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;
|
int32_t old = 1;
|
||||||
if (atomic_try_cmpxchg_acquire(NXSEM_COUNT(sem), &old, 0))
|
if (atomic_try_cmpxchg_acquire(NXSEM_COUNT(sem), &old, 0))
|
||||||
@@ -155,7 +158,6 @@ int nxsem_trywait(FAR sem_t *sem)
|
|||||||
|
|
||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
return nxsem_trywait_slow(sem);
|
return nxsem_trywait_slow(sem);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -265,8 +265,11 @@ int nxsem_wait(FAR sem_t *sem)
|
|||||||
* else try to get it in slow mode.
|
* 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;
|
int32_t old = 1;
|
||||||
if (atomic_try_cmpxchg_acquire(NXSEM_COUNT(sem), &old, 0))
|
if (atomic_try_cmpxchg_acquire(NXSEM_COUNT(sem), &old, 0))
|
||||||
@@ -274,7 +277,6 @@ int nxsem_wait(FAR sem_t *sem)
|
|||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
return nxsem_wait_slow(sem);
|
return nxsem_wait_slow(sem);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user