mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-04 19:17:47 +00:00
d1fe02df23
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.
39 lines
1.1 KiB
Go
39 lines
1.1 KiB
Go
package task
|
|
|
|
import (
|
|
"unsafe"
|
|
)
|
|
|
|
// Task is a state of goroutine for scheduling purposes.
|
|
type Task struct {
|
|
// Next is a field which can be used to make a linked list of tasks.
|
|
Next *Task
|
|
|
|
// Ptr is a field which can be used for storing a pointer.
|
|
Ptr unsafe.Pointer
|
|
|
|
// Data is a field which can be used for storing state information.
|
|
Data uint64
|
|
|
|
// gcData holds data for the GC.
|
|
gcData gcData
|
|
|
|
// state is the underlying running state of the task.
|
|
state state
|
|
|
|
// DeferFrame stores a pointer to the (stack allocated) defer frame of the
|
|
// goroutine that is used for the recover builtin.
|
|
DeferFrame unsafe.Pointer
|
|
}
|
|
|
|
// getGoroutineStackSize is a compiler intrinsic that returns the stack size for
|
|
// the given function and falls back to the default stack size. It is replaced
|
|
// with a load from a special section just before codegen.
|
|
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)
|