diff --git a/kernel-src/include/kernel/scheduler.h b/kernel-src/include/kernel/scheduler.h index 8e0c29af..98cf9173 100644 --- a/kernel-src/include/kernel/scheduler.h +++ b/kernel-src/include/kernel/scheduler.h @@ -44,6 +44,7 @@ typedef struct thread_t { bool sleepintstatus; spinlock_t sleeplock; int wakeupreason; + bool shouldexit; } thread_t; typedef struct proc_t { diff --git a/kernel-src/sys/scheduler.c b/kernel-src/sys/scheduler.c index cbeaffbb..610bd49a 100644 --- a/kernel-src/sys/scheduler.c +++ b/kernel-src/sys/scheduler.c @@ -262,6 +262,14 @@ static void yield(context_t *context) { thread_t *next = runqueuenext(sleeping ? 0x0fffffff : thread->priority); + if (sleeping && thread->shouldexit && (thread->flags & SCHED_THREAD_FLAGS_INTERRUPTIBLE)) { + sleeping = false; + next = NULL; + thread->flags &= ~(SCHED_THREAD_FLAGS_SLEEP | SCHED_THREAD_FLAGS_INTERRUPTIBLE); + thread->wakeupreason = SCHED_WAKEUP_REASON_INTERRUPTED; + spinlock_release(&thread->sleeplock); + } + if (next || sleeping) { ARCH_CONTEXT_THREADSAVE(thread, context);