wasm: support -scheduler=none
Previously, -scheduler=none wasn't possible for WASM targets: $ tinygo run -target=wasm -scheduler=none ./testdata/stdlib.go src/runtime/runtime_wasm_js.go:34:2: attempted to start a goroutine without a scheduler With this commit, it works just fine: $ tinygo run -target=wasm -scheduler=none ./testdata/stdlib.go stdin: /dev/stdin stdout: /dev/stdout stderr: /dev/stderr pseudorandom number: 1298498081 strings.IndexByte: 2 strings.Replace: An-example-string Supporting `-scheduler=none` has some benefits: * it reduces file size a lot compared to having a scheduler * it allows JavaScript to call exported functions
Этот коммит содержится в:
родитель
22c35c8e31
коммит
51290e5842
3 изменённых файлов: 33 добавлений и 29 удалений
|
@ -164,7 +164,7 @@ func runPlatTests(options compileopts.Options, tests []string, t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
runTest("env.go", options, t, []string{"first", "second"}, []string{"ENV1=VALUE1", "ENV2=VALUE2"})
|
runTest("env.go", options, t, []string{"first", "second"}, []string{"ENV1=VALUE1", "ENV2=VALUE2"})
|
||||||
})
|
})
|
||||||
if options.Target == "wasi" {
|
if options.Target == "wasi" || options.Target == "wasm" {
|
||||||
t.Run("alias.go-scheduler-none", func(t *testing.T) {
|
t.Run("alias.go-scheduler-none", func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
options := compileopts.Options(options)
|
options := compileopts.Options(options)
|
||||||
|
|
|
@ -29,34 +29,6 @@ func setEventHandler(fn func()) {
|
||||||
handleEvent = fn
|
handleEvent = fn
|
||||||
}
|
}
|
||||||
|
|
||||||
//export resume
|
|
||||||
func resume() {
|
|
||||||
go func() {
|
|
||||||
handleEvent()
|
|
||||||
}()
|
|
||||||
|
|
||||||
if wasmNested {
|
|
||||||
minSched()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
wasmNested = true
|
|
||||||
scheduler()
|
|
||||||
wasmNested = false
|
|
||||||
}
|
|
||||||
|
|
||||||
//export go_scheduler
|
|
||||||
func go_scheduler() {
|
|
||||||
if wasmNested {
|
|
||||||
minSched()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
wasmNested = true
|
|
||||||
scheduler()
|
|
||||||
wasmNested = false
|
|
||||||
}
|
|
||||||
|
|
||||||
func ticksToNanoseconds(ticks timeUnit) int64 {
|
func ticksToNanoseconds(ticks timeUnit) int64 {
|
||||||
// The JavaScript API works in float64 milliseconds, so convert to
|
// The JavaScript API works in float64 milliseconds, so convert to
|
||||||
// nanoseconds first before converting to a timeUnit (which is a float64),
|
// nanoseconds first before converting to a timeUnit (which is a float64),
|
||||||
|
|
32
src/runtime/runtime_wasm_js_scheduler.go
Обычный файл
32
src/runtime/runtime_wasm_js_scheduler.go
Обычный файл
|
@ -0,0 +1,32 @@
|
||||||
|
//go:build wasm && !wasi && !scheduler.none
|
||||||
|
// +build wasm,!wasi,!scheduler.none
|
||||||
|
|
||||||
|
package runtime
|
||||||
|
|
||||||
|
//export resume
|
||||||
|
func resume() {
|
||||||
|
go func() {
|
||||||
|
handleEvent()
|
||||||
|
}()
|
||||||
|
|
||||||
|
if wasmNested {
|
||||||
|
minSched()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
wasmNested = true
|
||||||
|
scheduler()
|
||||||
|
wasmNested = false
|
||||||
|
}
|
||||||
|
|
||||||
|
//export go_scheduler
|
||||||
|
func go_scheduler() {
|
||||||
|
if wasmNested {
|
||||||
|
minSched()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
wasmNested = true
|
||||||
|
scheduler()
|
||||||
|
wasmNested = false
|
||||||
|
}
|
Загрузка…
Создание таблицы
Сослаться в новой задаче