From 53e9c5b986f4d35fe1087d8b62dab83f7609a99a Mon Sep 17 00:00:00 2001 From: Yongrong Wang Date: Thu, 9 Jan 2025 20:26:25 +0800 Subject: [PATCH] sem_rw: optimize up_read/up_write API This change optimizes the reader-writer semaphore release process by consolidating redundant context switch operations and improving code efficiency, reducing unnecessary wake-ups during concurrent access scenarios. Signed-off-by: Yongrong Wang --- sched/semaphore/sem_rw.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/sched/semaphore/sem_rw.c b/sched/semaphore/sem_rw.c index a79ce0c0848..8b1c7e1d249 100644 --- a/sched/semaphore/sem_rw.c +++ b/sched/semaphore/sem_rw.c @@ -169,6 +169,7 @@ void up_read(FAR rw_semaphore_t *rwsem) if (--rwsem->writer <= 0) { rwsem->holder = RWSEM_NO_HOLDER; + up_wait(rwsem); } goto out; @@ -176,9 +177,7 @@ void up_read(FAR rw_semaphore_t *rwsem) DEBUGASSERT(rwsem->reader > 0); - rwsem->reader--; - - if (rwsem->waiter > 0) + if (--rwsem->reader <= 0) { up_wait(rwsem); } @@ -281,10 +280,9 @@ void up_write(FAR rw_semaphore_t *rwsem) if (--rwsem->writer <= 0) { rwsem->holder = RWSEM_NO_HOLDER; + up_wait(rwsem); } - up_wait(rwsem); - nxmutex_unlock(&rwsem->protected); }