runtime: map every goroutine to a new OS thread

This is not a scheduler in the runtime, instead every goroutine is
mapped to a single OS thread - meaning 1:1 scheduling.

While this may not perform well (or at all) for large numbers of
threads, it greatly simplifies many things in the runtime. For example,
blocking syscalls can be called directly instead of having to use epoll
or similar. Also, we don't need to do anything special to call C code -
the default stack is all we need.
This commit is contained in:
Ayke van Laethem
2024-10-24 10:26:17 +02:00
parent 8d6e16019a
commit 3767decf9e
11 changed files with 567 additions and 4 deletions
+25
View File
@@ -0,0 +1,25 @@
//go:build scheduler.threads
package runtime
import "internal/task"
func gcMarkReachable() {
task.GCScan()
}
// Scan globals inside the stop-the-world phase. Called from the STW
// implementation in the internal/task package.
//
//go:linkname gcScanGlobals internal/task.gcScanGlobals
func gcScanGlobals() {
findGlobals(markRoots)
}
// Function called from assembly with all registers pushed, to actually scan the
// stack.
//
//go:export tinygo_scanstack
func scanstack(sp uintptr) {
markRoots(sp, task.StackTop())
}