semaphore: fix bug when used on stack

This commit is contained in:
Matheus
2025-08-31 13:07:15 -03:00
parent 5a54949e0e
commit 81c7d77ad0
+9 -8
View File
@@ -114,17 +114,18 @@ void semaphore_signal(semaphore_t *sem) {
bool intstate = interrupt_set(false); bool intstate = interrupt_set(false);
spinlock_acquire(&sem->lock); spinlock_acquire(&sem->lock);
thread_t *thread = NULL;
if (++sem->i <= 0) { if (++sem->i <= 0) {
thread_t *thread = get(sem); thread = get(sem);
// a thread will always be returned if sem->i <= 0 // a thread will always be returned if sem->i <= 0
__assert(thread); __assert(thread);
// XXX the current method doesn't respect thread priorities
sched_wakeup(thread, 0);
} }
spinlock_release(&sem->lock); spinlock_release(&sem->lock);
interrupt_set(intstate); interrupt_set(intstate);
if (thread)
sched_wakeup(thread, 0);
} }
bool semaphore_signal_limit(semaphore_t *sem, int limit) { 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); spinlock_acquire(&sem->lock);
bool successful = false; bool successful = false;
thread_t *thread = NULL;
if (sem->i >= limit) if (sem->i >= limit)
goto leave; goto leave;
if (++sem->i <= 0) { if (++sem->i <= 0) {
thread_t *thread = get(sem); thread = get(sem);
// a thread will always be returned if sem->i <= 0 // a thread will always be returned if sem->i <= 0
__assert(thread); __assert(thread);
// XXX the current method doesn't respect thread priorities
sched_wakeup(thread, 0);
} }
successful = true; successful = true;
@@ -150,6 +149,8 @@ bool semaphore_signal_limit(semaphore_t *sem, int limit) {
leave: leave:
spinlock_release(&sem->lock); spinlock_release(&sem->lock);
interrupt_set(intstate); interrupt_set(intstate);
if (thread)
sched_wakeup(thread, 0);
return successful; return successful;
} }