From 3cc9c44c268905c0a5965698267acfc61a034ee5 Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Sat, 2 Nov 2024 13:45:17 +0100 Subject: [PATCH] runtime: refactor timerQueue Move common functions to scheduler.go. They will be used both from the cooperative and from the threads scheduler. --- src/runtime/scheduler.go | 30 ++++++++++++++++++++++++++++ src/runtime/scheduler_cooperative.go | 26 ++---------------------- 2 files changed, 32 insertions(+), 24 deletions(-) diff --git a/src/runtime/scheduler.go b/src/runtime/scheduler.go index 727c7f5f2..7461c966e 100644 --- a/src/runtime/scheduler.go +++ b/src/runtime/scheduler.go @@ -6,6 +6,8 @@ const schedulerDebug = false var mainExited bool +var timerQueue *timerNode + // Simple logging, for debugging. func scheduleLog(msg string) { if schedulerDebug { @@ -27,6 +29,34 @@ func scheduleLogChan(msg string, ch *channel, t *task.Task) { } } +func timerQueueAdd(tn *timerNode) { + q := &timerQueue + for ; *q != nil; q = &(*q).next { + if tn.whenTicks() < (*q).whenTicks() { + // this will finish earlier than the next - insert here + break + } + } + tn.next = *q + *q = tn +} + +func timerQueueRemove(t *timer) bool { + removedTimer := false + for q := &timerQueue; *q != nil; q = &(*q).next { + if (*q).timer == t { + scheduleLog("removed timer") + *q = (*q).next + removedTimer = true + break + } + } + if !removedTimer { + scheduleLog("did not remove timer") + } + return removedTimer +} + // Goexit terminates the currently running goroutine. No other goroutines are affected. func Goexit() { panicOrGoexit(nil, panicGoexit) diff --git a/src/runtime/scheduler_cooperative.go b/src/runtime/scheduler_cooperative.go index 91ba86409..85c8f56f0 100644 --- a/src/runtime/scheduler_cooperative.go +++ b/src/runtime/scheduler_cooperative.go @@ -32,7 +32,6 @@ var ( runqueue task.Queue sleepQueue *task.Task sleepQueueBaseTime timeUnit - timerQueue *timerNode ) // deadlock is called when a goroutine cannot proceed any more, but is in theory @@ -100,36 +99,15 @@ func addSleepTask(t *task.Task, duration timeUnit) { // sleepQueue. func addTimer(tim *timerNode) { mask := interrupt.Disable() - - // Add to timer queue. - q := &timerQueue - for ; *q != nil; q = &(*q).next { - if tim.whenTicks() < (*q).whenTicks() { - // this will finish earlier than the next - insert here - break - } - } - tim.next = *q - *q = tim + timerQueueAdd(tim) interrupt.Restore(mask) } // removeTimer is the implementation of time.stopTimer. It removes a timer from // the timer queue, returning true if the timer is present in the timer queue. func removeTimer(tim *timer) bool { - removedTimer := false mask := interrupt.Disable() - for t := &timerQueue; *t != nil; t = &(*t).next { - if (*t).timer == tim { - scheduleLog("removed timer") - *t = (*t).next - removedTimer = true - break - } - } - if !removedTimer { - scheduleLog("did not remove timer") - } + removedTimer := timerQueueRemove(tim) interrupt.Restore(mask) return removedTimer }