sched/sem_rw.c: Add downgrade_write API for sem_rw

support downgrad a write lock to a read lock

Signed-off-by: Yongrong Wang <wangyongrong@xiaomi.com>
This commit is contained in:
Yongrong Wang
2024-12-19 11:42:04 +08:00
committed by Xiang Xiao
parent f9272fa090
commit eac3cea465
2 changed files with 40 additions and 0 deletions
+13
View File
@@ -142,6 +142,19 @@ void down_write(FAR rw_semaphore_t *rwsem);
void up_write(FAR rw_semaphore_t *rwsem);
/****************************************************************************
* Name: downgrade_write
*
* Description:
* Down grade write lock to read lock on a read-write-lock object.
*
* Input Parameters:
* rwsem - Pointer to the read-write-lock descriptor.
*
****************************************************************************/
void downgrade_write(FAR rw_semaphore_t *rwsem);
/****************************************************************************
* Name: init_rwsem
*
+27
View File
@@ -286,6 +286,33 @@ void up_write(FAR rw_semaphore_t *rwsem)
nxmutex_unlock(&rwsem->protected);
}
/****************************************************************************
* Name: downgrade_write
*
* Description:
* Downgrade write lock to read lock on a read-write-lock object.
*
* Input Parameters:
* rwsem - Pointer to the read-write-lock descriptor.
*
****************************************************************************/
void downgrade_write(FAR rw_semaphore_t *rwsem)
{
nxmutex_lock(&rwsem->protected);
DEBUGASSERT(rwsem->writer == 1);
DEBUGASSERT(rwsem->reader == 0);
DEBUGASSERT(rwsem->holder == _SCHED_GETTID());
rwsem->writer = 0;
rwsem->reader++;
rwsem->holder = RWSEM_NO_HOLDER;
up_wait(rwsem);
nxmutex_unlock(&rwsem->protected);
}
/****************************************************************************
* Name: init_rwsem
*