aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/internal
diff options
context:
space:
mode:
authorAyke van Laethem <[email protected]>2024-10-25 11:14:57 +0200
committerRon Evans <[email protected]>2024-11-20 12:45:09 +0100
commitd1fe02df230e1a31ba9ff8f440a5ef33a60d1313 (patch)
tree1cb0d8847b7eb84fb87db0f9fc2200311dcb12d6 /src/internal
parent6593cf22fad6fab2a201ed00c2cc20c76e29161a (diff)
downloadtinygo-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.go3
-rw-r--r--src/internal/task/task_asyncify.go5
-rw-r--r--src/internal/task/task_stack.go5
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.