From 26e9f370b5cf0462ef5313ed2225ee4bf7f5e502 Mon Sep 17 00:00:00 2001 From: Matheus Date: Thu, 4 May 2023 22:45:49 -0300 Subject: [PATCH] semaphore: disable interrupts while lock is held --- kernel-src/lib/semaphore.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/kernel-src/lib/semaphore.c b/kernel-src/lib/semaphore.c index a934d2c1..7b42e077 100644 --- a/kernel-src/lib/semaphore.c +++ b/kernel-src/lib/semaphore.c @@ -29,6 +29,7 @@ static thread_t *get(semaphore_t *sem) { } int semaphore_wait(semaphore_t *sem, bool interruptible) { + bool intstate = interrupt_set(false); int ret = 0; spinlock_acquire(&sem->lock); @@ -40,10 +41,12 @@ int semaphore_wait(semaphore_t *sem, bool interruptible) { } spinlock_release(&sem->lock); + interrupt_set(intstate); return ret; } void semaphore_signal(semaphore_t *sem) { + bool intstate = interrupt_set(false); spinlock_acquire(&sem->lock); if (++sem->i <= 0) { thread_t *thread = get(sem); @@ -51,9 +54,11 @@ void semaphore_signal(semaphore_t *sem) { sched_wakeup(thread, 0); } spinlock_release(&sem->lock); + interrupt_set(intstate); } bool semaphore_test(semaphore_t *sem) { + bool intstate = interrupt_set(false); bool ret = false; spinlock_acquire(&sem->lock); @@ -63,5 +68,6 @@ bool semaphore_test(semaphore_t *sem) { } spinlock_release(&sem->lock); + interrupt_set(intstate); return ret; }