scheduler: handle interruptions in sched_yield() when sleeping as to prevent lost wakeup

This commit is contained in:
Matheus
2024-04-14 12:42:43 -03:00
parent f19f784694
commit 55f407da08
2 changed files with 9 additions and 0 deletions
+1
View File
@@ -44,6 +44,7 @@ typedef struct thread_t {
bool sleepintstatus;
spinlock_t sleeplock;
int wakeupreason;
bool shouldexit;
} thread_t;
typedef struct proc_t {
+8
View File
@@ -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);