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


The following commit(s) were added to refs/heads/master by this push:
     new 4541132035 Revert "shced:sem: replace mutex with spinlock"
4541132035 is described below

commit 4541132035d6441319ac4abd82bcdf3e27504d0e
Author: ligd <[email protected]>
AuthorDate: Thu Oct 24 18:26:00 2024 +0800

    Revert "shced:sem: replace mutex with spinlock"
    
    Cause we can't do sem_post/wait within spinlock
    
    This reverts commit 23d65cb97f1019c98707c5536fe790398a0c164a.
    
    Signed-off-by: ligd <[email protected]>
---
 include/nuttx/rwsem.h    |  7 +++----
 sched/semaphore/sem_rw.c | 47 +++++++++++++++++++++++++++--------------------
 2 files changed, 30 insertions(+), 24 deletions(-)

diff --git a/include/nuttx/rwsem.h b/include/nuttx/rwsem.h
index aa5e7d8daa..e098da9752 100644
--- a/include/nuttx/rwsem.h
+++ b/include/nuttx/rwsem.h
@@ -27,15 +27,14 @@
  * Included Files
  ****************************************************************************/
 
-#include <nuttx/semaphore.h>
-#include <nuttx/spinlock.h>
+#include <nuttx/mutex.h>
 
 /****************************************************************************
  * Pre-processor Definitions
  ****************************************************************************/
 
 #define RWSEM_NO_HOLDER     ((pid_t)-1)
-#define RWSEM_INITIALIZER   {SEM_INITIALIZER(0), \
+#define RWSEM_INITIALIZER   {NXMUTEX_INITIALIZER, SEM_INITIALIZER(0), \
                              RWSEM_NO_HOLDER, 0, 0, 0}
 
 /****************************************************************************
@@ -44,6 +43,7 @@
 
 typedef struct
 {
+  mutex_t protected;    /* Protecting Locks for Read/Write Locked Tables */
   sem_t   waiting;      /* Reader/writer Waiting queue */
   pid_t   holder;       /* The write lock holder, this lock still can be
                          * locked when the holder is same as the current
@@ -52,7 +52,6 @@ typedef struct
   int     waiter;       /* Waiter Count */
   int     writer;       /* Writer Count */
   int     reader;       /* Reader Count */
-  spinlock_t protected; /* Protecting Locks for Read/Write Locked Tables */
 } rw_semaphore_t;
 
 /****************************************************************************
diff --git a/sched/semaphore/sem_rw.c b/sched/semaphore/sem_rw.c
index e5415ca73d..f9561599c4 100644
--- a/sched/semaphore/sem_rw.c
+++ b/sched/semaphore/sem_rw.c
@@ -24,7 +24,6 @@
  * Included Files
  ****************************************************************************/
 
-#include <nuttx/irq.h>
 #include <nuttx/rwsem.h>
 #include <nuttx/sched.h>
 #include <assert.h>
@@ -66,7 +65,7 @@ static inline void up_wait(FAR rw_semaphore_t *rwsem)
 
 int down_read_trylock(FAR rw_semaphore_t *rwsem)
 {
-  irqstate_t flags = spin_lock_irqsave(&rwsem->protected);
+  nxmutex_lock(&rwsem->protected);
 
   /* if the write lock is already held by oneself and since the write lock
    * can be recursively held, so, this operation can be converted to a write
@@ -81,7 +80,7 @@ int down_read_trylock(FAR rw_semaphore_t *rwsem)
 
   if (rwsem->writer > 0)
     {
-      spin_unlock_irqrestore(&rwsem->protected, flags);
+      nxmutex_unlock(&rwsem->protected);
       return 0;
     }
 
@@ -92,7 +91,7 @@ int down_read_trylock(FAR rw_semaphore_t *rwsem)
   rwsem->reader++;
 
 out:
-  spin_unlock_irqrestore(&rwsem->protected, flags);
+  nxmutex_unlock(&rwsem->protected);
 
   return 1;
 }
@@ -114,7 +113,7 @@ void down_read(FAR rw_semaphore_t *rwsem)
    * block and wait for the write-lock to be unlocked.
    */
 
-  irqstate_t flags = spin_lock_irqsave(&rwsem->protected);
+  nxmutex_lock(&rwsem->protected);
 
   /* if the write lock is already held by oneself and since the write lock
    * can be recursively held, so, this operation can be converted to a write
@@ -130,9 +129,9 @@ void down_read(FAR rw_semaphore_t *rwsem)
   while (rwsem->writer > 0)
     {
       rwsem->waiter++;
-      spin_unlock_irqrestore(&rwsem->protected, flags);
+      nxmutex_unlock(&rwsem->protected);
       nxsem_wait(&rwsem->waiting);
-      flags = spin_lock_irqsave(&rwsem->protected);
+      nxmutex_lock(&rwsem->protected);
       rwsem->waiter--;
     }
 
@@ -143,7 +142,7 @@ void down_read(FAR rw_semaphore_t *rwsem)
   rwsem->reader++;
 
 out:
-  spin_unlock_irqrestore(&rwsem->protected, flags);
+  nxmutex_unlock(&rwsem->protected);
 }
 
 /****************************************************************************
@@ -159,7 +158,7 @@ out:
 
 void up_read(FAR rw_semaphore_t *rwsem)
 {
-  irqstate_t flags = spin_lock_irqsave(&rwsem->protected);
+  nxmutex_lock(&rwsem->protected);
 
   /* when releasing a read lock and holder is oneself, the read lock is a
    * write lock that has been converted, so it should be released according
@@ -186,7 +185,7 @@ void up_read(FAR rw_semaphore_t *rwsem)
     }
 
 out:
-  spin_unlock_irqrestore(&rwsem->protected, flags);
+  nxmutex_unlock(&rwsem->protected);
 }
 
 /****************************************************************************
@@ -205,12 +204,13 @@ out:
 
 int down_write_trylock(FAR rw_semaphore_t *rwsem)
 {
-  irqstate_t flags = spin_lock_irqsave(&rwsem->protected);
   pid_t tid = _SCHED_GETTID();
 
+  nxmutex_lock(&rwsem->protected);
+
   if (rwsem->reader > 0 || (rwsem->writer > 0 && tid != rwsem->holder))
     {
-      spin_unlock_irqrestore(&rwsem->protected, flags);
+      nxmutex_unlock(&rwsem->protected);
       return 0;
     }
 
@@ -219,7 +219,7 @@ int down_write_trylock(FAR rw_semaphore_t *rwsem)
   rwsem->writer++;
   rwsem->holder = tid;
 
-  spin_unlock_irqrestore(&rwsem->protected, flags);
+  nxmutex_unlock(&rwsem->protected);
 
   return 1;
 }
@@ -237,15 +237,16 @@ int down_write_trylock(FAR rw_semaphore_t *rwsem)
 
 void down_write(FAR rw_semaphore_t *rwsem)
 {
-  irqstate_t flags = spin_lock_irqsave(&rwsem->protected);
   pid_t tid = _SCHED_GETTID();
 
+  nxmutex_lock(&rwsem->protected);
+
   while (rwsem->reader > 0 || (rwsem->writer > 0 && rwsem->holder != tid))
     {
       rwsem->waiter++;
-      spin_unlock_irqrestore(&rwsem->protected, flags);
+      nxmutex_unlock(&rwsem->protected);
       nxsem_wait(&rwsem->waiting);
-      flags = spin_lock_irqsave(&rwsem->protected);
+      nxmutex_lock(&rwsem->protected);
       rwsem->waiter--;
     }
 
@@ -254,7 +255,7 @@ void down_write(FAR rw_semaphore_t *rwsem)
   rwsem->writer++;
   rwsem->holder = tid;
 
-  spin_unlock_irqrestore(&rwsem->protected, flags);
+  nxmutex_unlock(&rwsem->protected);
 }
 
 /****************************************************************************
@@ -270,7 +271,7 @@ void down_write(FAR rw_semaphore_t *rwsem)
 
 void up_write(FAR rw_semaphore_t *rwsem)
 {
-  irqstate_t flags = spin_lock_irqsave(&rwsem->protected);
+  nxmutex_lock(&rwsem->protected);
 
   DEBUGASSERT(rwsem->writer > 0);
   DEBUGASSERT(rwsem->holder == _SCHED_GETTID());
@@ -282,7 +283,7 @@ void up_write(FAR rw_semaphore_t *rwsem)
 
   up_wait(rwsem);
 
-  spin_unlock_irqrestore(&rwsem->protected, flags);
+  nxmutex_unlock(&rwsem->protected);
 }
 
 /****************************************************************************
@@ -306,11 +307,16 @@ int init_rwsem(FAR rw_semaphore_t *rwsem)
 
   /* Initialize structure information */
 
-  spin_lock_init(&rwsem->protected);
+  ret = nxmutex_init(&rwsem->protected);
+  if (ret < 0)
+    {
+      return ret;
+    }
 
   ret = nxsem_init(&rwsem->waiting, 0, 0);
   if (ret < 0)
     {
+      nxmutex_destroy(&rwsem->protected);
       return ret;
     }
 
@@ -341,5 +347,6 @@ void destroy_rwsem(FAR rw_semaphore_t *rwsem)
   DEBUGASSERT(rwsem->waiter == 0 && rwsem->reader == 0 &&
               rwsem->writer == 0 && rwsem->holder == RWSEM_NO_HOLDER);
 
+  nxmutex_destroy(&rwsem->protected);
   nxsem_destroy(&rwsem->waiting);
 }

Reply via email to