From 5eec686ccff097b86c90eafdf279d16f87b51a0f Mon Sep 17 00:00:00 2001 From: Yongrong Wang Date: Thu, 9 Jan 2025 20:26:25 +0800 Subject: [PATCH 1/2] 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 1c2a34ad6d55a..b9c94be58a782 100644 --- a/sched/semaphore/sem_rw.c +++ b/sched/semaphore/sem_rw.c @@ -170,6 +170,7 @@ void up_read(FAR rw_semaphore_t *rwsem) if (--rwsem->writer <= 0) { rwsem->holder = RWSEM_NO_HOLDER; + up_wait(rwsem); } goto out; @@ -177,9 +178,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); } @@ -279,10 +278,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); } From ca164e6b4a083ddc678306987518683ee5f2a3e7 Mon Sep 17 00:00:00 2001 From: hujun5 Date: Thu, 14 Aug 2025 19:22:56 +0800 Subject: [PATCH 2/2] sem_rw.c: coverity: HIS_metric_violation(HIS_GOTO) This change replaces goto-based control flow with structured if-else blocks in the up_read() function to comply with MISRA HIS coding standards while maintaining identical functional behavior. Signed-off-by: hujun5 --- sched/semaphore/sem_rw.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/sched/semaphore/sem_rw.c b/sched/semaphore/sem_rw.c index b9c94be58a782..71c26b7811f5f 100644 --- a/sched/semaphore/sem_rw.c +++ b/sched/semaphore/sem_rw.c @@ -172,18 +172,17 @@ void up_read(FAR rw_semaphore_t *rwsem) rwsem->holder = RWSEM_NO_HOLDER; up_wait(rwsem); } - - goto out; } - - DEBUGASSERT(rwsem->reader > 0); - - if (--rwsem->reader <= 0) + else { - up_wait(rwsem); + DEBUGASSERT(rwsem->reader > 0); + + if (--rwsem->reader <= 0) + { + up_wait(rwsem); + } } -out: nxmutex_unlock(&rwsem->protected); }