diff options
author | Ayke van Laethem <[email protected]> | 2024-10-25 11:14:57 +0200 |
---|---|---|
committer | Ron Evans <[email protected]> | 2024-11-20 12:45:09 +0100 |
commit | d1fe02df230e1a31ba9ff8f440a5ef33a60d1313 (patch) | |
tree | 1cb0d8847b7eb84fb87db0f9fc2200311dcb12d6 /src/internal | |
parent | 6593cf22fad6fab2a201ed00c2cc20c76e29161a (diff) | |
download | tinygo-d1fe02df230e1a31ba9ff8f440a5ef33a60d1313.tar.gz tinygo-d1fe02df230e1a31ba9ff8f440a5ef33a60d1313.zip |
runtime: move scheduler code around
This moves all scheduler code into a separate file that is only compiled
when there's a scheduler in use (the tasks or asyncify scheduler, which
are both cooperative). The main goal of this change is to make it easier
to add a new "scheduler" based on OS threads.
It also fixes a few subtle issues with `-gc=none`:
- Gosched() panicked. This is now fixed to just return immediately
(the only logical thing to do when there's only one goroutine).
- Timers aren't supported without a scheduler, but the relevant code
was still present and would happily add a timer to the queue. It
just never ran. So now it exits with a runtime error, similar to any
blocking operation.
Diffstat (limited to 'src/internal')
-rw-r--r-- | src/internal/task/task.go | 3 | ||||
-rw-r--r-- | src/internal/task/task_asyncify.go | 5 | ||||
-rw-r--r-- | src/internal/task/task_stack.go | 5 |
3 files changed, 5 insertions, 8 deletions
diff --git a/src/internal/task/task.go b/src/internal/task/task.go index c1ee57dda..bce65b582 100644 --- a/src/internal/task/task.go +++ b/src/internal/task/task.go @@ -33,3 +33,6 @@ func getGoroutineStackSize(fn uintptr) uintptr //go:linkname runtime_alloc runtime.alloc func runtime_alloc(size uintptr, layout unsafe.Pointer) unsafe.Pointer + +//go:linkname scheduleTask runtime.scheduleTask +func scheduleTask(*Task) diff --git a/src/internal/task/task_asyncify.go b/src/internal/task/task_asyncify.go index 55a1044e4..637a6b223 100644 --- a/src/internal/task/task_asyncify.go +++ b/src/internal/task/task_asyncify.go @@ -52,7 +52,7 @@ type stackState struct { func start(fn uintptr, args unsafe.Pointer, stackSize uintptr) { t := &Task{} t.state.initialize(fn, args, stackSize) - runqueuePushBack(t) + scheduleTask(t) } //export tinygo_launch @@ -82,9 +82,6 @@ func (s *state) initialize(fn uintptr, args unsafe.Pointer, stackSize uintptr) { s.csp = unsafe.Add(stack, stackSize) } -//go:linkname runqueuePushBack runtime.runqueuePushBack -func runqueuePushBack(*Task) - // currentTask is the current running task, or nil if currently in the scheduler. var currentTask *Task diff --git a/src/internal/task/task_stack.go b/src/internal/task/task_stack.go index 551612425..88a097068 100644 --- a/src/internal/task/task_stack.go +++ b/src/internal/task/task_stack.go @@ -101,15 +101,12 @@ func swapTask(oldStack uintptr, newStack *uintptr) //go:extern tinygo_startTask var startTask [0]uint8 -//go:linkname runqueuePushBack runtime.runqueuePushBack -func runqueuePushBack(*Task) - // start creates and starts a new goroutine with the given function and arguments. // The new goroutine is scheduled to run later. func start(fn uintptr, args unsafe.Pointer, stackSize uintptr) { t := &Task{} t.state.initialize(fn, args, stackSize) - runqueuePushBack(t) + scheduleTask(t) } // OnSystemStack returns whether the caller is running on the system stack. |