]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: Plan 9 - prevent preemption by GC while exiting
authorRichard Miller <miller.research@gmail.com>
Wed, 9 Mar 2016 16:16:05 +0000 (16:16 +0000)
committerBrad Fitzpatrick <bradfitz@golang.org>
Wed, 9 Mar 2016 16:48:00 +0000 (16:48 +0000)
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/20477
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/runtime/os1_plan9.go

index c114b1db628af53dcf565ddc3dc14b61d40f9540..b0b05bb7d73c5a13c6535af1abf72804d95d51b4 100644 (file)
@@ -151,6 +151,7 @@ var goexits = []byte("go: exit ")
 
 func goexitsall(status *byte) {
        var buf [_ERRMAX]byte
+       getg().m.locks++
        n := copy(buf[:], goexits)
        n = copy(buf[n:], gostringnocopy(status))
        pid := getpid()
@@ -159,6 +160,7 @@ func goexitsall(status *byte) {
                        postnote(mp.procid, buf[:])
                }
        }
+       getg().m.locks--
 }
 
 var procdir = []byte("/proc/")