This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit 53e9c5b986f4d35fe1087d8b62dab83f7609a99a
Author: Yongrong Wang <[email protected]>
AuthorDate: Thu Jan 9 20:26:25 2025 +0800

    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 <[email protected]>
---
 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);
 }
 

Reply via email to