From 4541132035d6441319ac4abd82bcdf3e27504d0e Mon Sep 17 00:00:00 2001 From: ligd Date: Thu, 24 Oct 2024 18:26:00 +0800 Subject: [PATCH] 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 --- 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 -#include +#include /**************************************************************************** * 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 #include #include #include @@ -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); }