| // +build js |
| // run |
| |
| // Copyright 2020 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // Test race condition between timers and wasm calls that led to memory corruption. |
| |
| package main |
| |
| import ( |
| "os" |
| "syscall/js" |
| "time" |
| ) |
| |
| func main() { |
| ch1 := make(chan struct{}) |
| |
| go func() { |
| for { |
| time.Sleep(5 * time.Millisecond) |
| ch1 <- struct{}{} |
| } |
| }() |
| go func() { |
| for { |
| time.Sleep(8 * time.Millisecond) |
| ch1 <- struct{}{} |
| } |
| }() |
| go func() { |
| time.Sleep(2 * time.Second) |
| os.Exit(0) |
| }() |
| |
| for range ch1 { |
| ch2 := make(chan struct{}, 1) |
| f := js.FuncOf(func(this js.Value, args []js.Value) interface{} { |
| ch2 <- struct{}{} |
| return nil |
| }) |
| defer f.Release() |
| fn := js.Global().Get("Function").New("cb", "cb();") |
| fn.Invoke(f) |
| <-ch2 |
| } |
| } |