Commit 6b59d618 authored by Richard Miller's avatar Richard Miller Committed by Brad Fitzpatrick

runtime: Plan 9 - prevent preemption by GC while exiting

On Plan 9, there's no "kill all threads" system call, so exit is done
by sending a "go: exit" note to each OS process.  If concurrent GC
occurs during this loop, deadlock sometimes results.  Prevent this by
incrementing m.locks before sending notes.

Change-Id: I31aa15134ff6e42d9a82f9f8a308620b3ad1b1b1
Reviewed-on: https://go-review.googlesource.com/20477Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 87103a1a
...@@ -151,6 +151,7 @@ var goexits = []byte("go: exit ") ...@@ -151,6 +151,7 @@ var goexits = []byte("go: exit ")
func goexitsall(status *byte) { func goexitsall(status *byte) {
var buf [_ERRMAX]byte var buf [_ERRMAX]byte
getg().m.locks++
n := copy(buf[:], goexits) n := copy(buf[:], goexits)
n = copy(buf[n:], gostringnocopy(status)) n = copy(buf[n:], gostringnocopy(status))
pid := getpid() pid := getpid()
...@@ -159,6 +160,7 @@ func goexitsall(status *byte) { ...@@ -159,6 +160,7 @@ func goexitsall(status *byte) {
postnote(mp.procid, buf[:]) postnote(mp.procid, buf[:])
} }
} }
getg().m.locks--
} }
var procdir = []byte("/proc/") var procdir = []byte("/proc/")
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment