aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/lock_js.go
diff options
context:
space:
mode:
authorRichard Musiol <mail@richard-musiol.de>2019-10-06 22:39:08 +0200
committerRichard Musiol <neelance@gmail.com>2019-10-07 18:13:27 +0000
commit1c8e6077f67ea33b752ebf93483517b03ad9393f (patch)
tree5ca4e368df0ce24133fe73fbf8fb15f4c69e42d0 /src/runtime/lock_js.go
parent30521d5126c47c9db0dd4cafc3de5bcf3c6348dd (diff)
downloadgo-1c8e6077f67ea33b752ebf93483517b03ad9393f.tar.gz
go-1c8e6077f67ea33b752ebf93483517b03ad9393f.zip
runtime: do not omit stack trace of goroutine that handles async events
On wasm there is a special goroutine that handles asynchronous events. Blocking this goroutine often causes a deadlock. However, the stack trace of this goroutine was omitted when printing the deadlock error. This change adds an exception so the goroutine is not considered as an internal system goroutine and the stack trace gets printed, which helps with debugging the deadlock. Updates #32764 Change-Id: Icc8f5ba3ca5a485d557b7bdd76bf2f1ffb92eb3e Reviewed-on: https://go-review.googlesource.com/c/go/+/199537 Run-TryBot: Richard Musiol <neelance@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
Diffstat (limited to 'src/runtime/lock_js.go')
-rw-r--r--src/runtime/lock_js.go16
1 files changed, 9 insertions, 7 deletions
diff --git a/src/runtime/lock_js.go b/src/runtime/lock_js.go
index c038499f2a..d08238ce3c 100644
--- a/src/runtime/lock_js.go
+++ b/src/runtime/lock_js.go
@@ -149,16 +149,18 @@ var returnedEventHandler *g
func init() {
// At the toplevel we need an extra goroutine that handles asynchronous events.
initg := getg()
- go func() {
- returnedEventHandler = getg()
- goready(initg, 1)
+ go handleAsyncEvents(initg)
+ gopark(nil, nil, waitReasonZero, traceEvNone, 1)
+}
- gopark(nil, nil, waitReasonZero, traceEvNone, 1)
- returnedEventHandler = nil
+func handleAsyncEvents(initg *g) {
+ returnedEventHandler = getg()
+ goready(initg, 1)
- pause(getcallersp() - 16)
- }()
gopark(nil, nil, waitReasonZero, traceEvNone, 1)
+ returnedEventHandler = nil
+
+ pause(getcallersp() - 16)
}
// beforeIdle gets called by the scheduler if no goroutine is awake.