From 81c7d77ad04b3a694ff998375fd661c464ae2617 Mon Sep 17 00:00:00 2001 From: Matheus Date: Sun, 31 Aug 2025 13:07:15 -0300 Subject: [PATCH] semaphore: fix bug when used on stack --- kernel-src/lib/semaphore.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/kernel-src/lib/semaphore.c b/kernel-src/lib/semaphore.c index e4380ee4..d8a7a771 100644 --- a/kernel-src/lib/semaphore.c +++ b/kernel-src/lib/semaphore.c @@ -114,17 +114,18 @@ void semaphore_signal(semaphore_t *sem) { bool intstate = interrupt_set(false); spinlock_acquire(&sem->lock); + thread_t *thread = NULL; if (++sem->i <= 0) { - thread_t *thread = get(sem); + thread = get(sem); // a thread will always be returned if sem->i <= 0 __assert(thread); - - // XXX the current method doesn't respect thread priorities - sched_wakeup(thread, 0); } spinlock_release(&sem->lock); interrupt_set(intstate); + + if (thread) + sched_wakeup(thread, 0); } bool semaphore_signal_limit(semaphore_t *sem, int limit) { @@ -132,17 +133,15 @@ bool semaphore_signal_limit(semaphore_t *sem, int limit) { spinlock_acquire(&sem->lock); bool successful = false; + thread_t *thread = NULL; if (sem->i >= limit) goto leave; if (++sem->i <= 0) { - thread_t *thread = get(sem); + thread = get(sem); // a thread will always be returned if sem->i <= 0 __assert(thread); - - // XXX the current method doesn't respect thread priorities - sched_wakeup(thread, 0); } successful = true; @@ -150,6 +149,8 @@ bool semaphore_signal_limit(semaphore_t *sem, int limit) { leave: spinlock_release(&sem->lock); interrupt_set(intstate); + if (thread) + sched_wakeup(thread, 0); return successful; }