]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: disable use of template thread on Plan 9
authorDavid du Colombier <0intro@gmail.com>
Thu, 12 Oct 2017 20:59:16 +0000 (22:59 +0200)
committerDavid du Colombier <0intro@gmail.com>
Tue, 17 Oct 2017 15:15:07 +0000 (15:15 +0000)
CL 46033 added a "template thread" mechanism to
allow creation of thread with a known-good state
from a thread of unknown state.

However, we are experiencing issues on Plan 9
with programs using the os/exec and net package.
These package are relying on runtime.LockOSThread.

Updates #22227.

Change-Id: I85b71580a41df9fe8b24bd8623c064b6773288b0
Reviewed-on: https://go-review.googlesource.com/70231
Run-TryBot: David du Colombier <0intro@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
src/runtime/proc.go

index b41f0c5ef80b1ee329aec4605ba97856239b2898..4133b2358490b0187bfff0e17e4726c1c9b5a6a4 100644 (file)
@@ -1813,7 +1813,7 @@ func newm(fn func(), _p_ *p) {
        mp := allocm(_p_, fn)
        mp.nextp.set(_p_)
        mp.sigmask = initSigmask
-       if gp := getg(); gp != nil && gp.m != nil && (gp.m.lockedExt != 0 || gp.m.incgo) {
+       if gp := getg(); gp != nil && gp.m != nil && (gp.m.lockedExt != 0 || gp.m.incgo) && GOOS != "plan9" {
                // We're on a locked M or a thread that may have been
                // started by C. The kernel state of this thread may
                // be strange (the user may have locked it for that
@@ -1821,6 +1821,8 @@ func newm(fn func(), _p_ *p) {
                // thread. Instead, ask a known-good thread to create
                // the thread for us.
                //
+               // This is disabled on Plan 9. See golang.org/issue/22227.
+               //
                // TODO: This may be unnecessary on Windows, which
                // doesn't model thread creation off fork.
                lock(&newmHandoff.lock)
@@ -3443,7 +3445,7 @@ func dolockOSThread() {
 // A goroutine should call LockOSThread before calling OS services or
 // non-Go library functions that depend on per-thread state.
 func LockOSThread() {
-       if atomic.Load(&newmHandoff.haveTemplateThread) == 0 {
+       if atomic.Load(&newmHandoff.haveTemplateThread) == 0 && GOOS != "plan9" {
                // If we need to start a new thread from the locked
                // thread, we need the template thread. Start it now
                // while we're in a known-good state.