mirror of
https://github.com/apache/nuttx.git
synced 2026-06-02 01:21:26 +08:00
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:
committed by
Xiang Xiao
parent
f9272fa090
commit
eac3cea465
@@ -142,6 +142,19 @@ void down_write(FAR rw_semaphore_t *rwsem);
|
|||||||
|
|
||||||
void up_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
|
* Name: init_rwsem
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -286,6 +286,33 @@ void up_write(FAR rw_semaphore_t *rwsem)
|
|||||||
nxmutex_unlock(&rwsem->protected);
|
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
|
* Name: init_rwsem
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user