diff --git a/kernel-src/lib/semaphore.c b/kernel-src/lib/semaphore.c index ac8e39c7..f09a98fa 100644 --- a/kernel-src/lib/semaphore.c +++ b/kernel-src/lib/semaphore.c @@ -114,6 +114,7 @@ void semaphore_signal(semaphore_t *sem) { // wake SOMEONE up. this will *try* to wake up a thread // it could wake up none though, as a thread could have been interrupted by a signal thread = get(sem); + // TODO this is broken // XXX the current method doesn't respect thread priorities if (thread) { sched_wakeup(thread, 0); diff --git a/kernel-src/sys/scheduler.c b/kernel-src/sys/scheduler.c index d152a12a..de78a85c 100644 --- a/kernel-src/sys/scheduler.c +++ b/kernel-src/sys/scheduler.c @@ -546,7 +546,11 @@ static void yield(context_t *context, void *) { if (sleeping && (thread->shouldexit || gotsignal) && (thread->flags & SCHED_THREAD_FLAGS_INTERRUPTIBLE)) { sleeping = false; + + if (next) + runqueueinsert(next); next = NULL; + thread->flags &= ~(SCHED_THREAD_FLAGS_SLEEP | SCHED_THREAD_FLAGS_INTERRUPTIBLE); thread->wakeupreason = SCHED_WAKEUP_REASON_INTERRUPTED; spinlock_release(&thread->sleeplock);