diff --git a/sched/semaphore/sem_rw.c b/sched/semaphore/sem_rw.c index 1c2a34ad6d55a..71c26b7811f5f 100644 --- a/sched/semaphore/sem_rw.c +++ b/sched/semaphore/sem_rw.c @@ -170,21 +170,19 @@ void up_read(FAR rw_semaphore_t *rwsem) if (--rwsem->writer <= 0) { rwsem->holder = RWSEM_NO_HOLDER; + up_wait(rwsem); } - - goto out; } - - DEBUGASSERT(rwsem->reader > 0); - - rwsem->reader--; - - if (rwsem->waiter > 0) + else { - up_wait(rwsem); + DEBUGASSERT(rwsem->reader > 0); + + if (--rwsem->reader <= 0) + { + up_wait(rwsem); + } } -out: nxmutex_unlock(&rwsem->protected); } @@ -279,10 +277,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); }