runtime: terminate locked OS thread if its goroutine exits

runtime.LockOSThread is sometimes used when the caller intends to put
the OS thread into an unusual state. In this case, we never want to
return this thread to the runtime thread pool. However, currently
exiting the goroutine implicitly unlocks its OS thread.

Fix this by terminating the locked OS thread when its goroutine exits,
rather than simply returning it to the pool.

Fixes #20395.

Change-Id: I3dcec63b200957709965f7240dc216fa84b62ad9
Reviewed-on: https://go-review.googlesource.com/46038
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
Austin Clements 2017-06-16 16:21:12 -04:00
parent eff2b2620d
commit 4f34a52913
9 changed files with 303 additions and 2 deletions

View file

@ -746,3 +746,20 @@ func TestLockOSThreadNesting(t *testing.T) {
}
}()
}
func TestLockOSThreadExit(t *testing.T) {
testLockOSThreadExit(t, "testprog")
}
func testLockOSThreadExit(t *testing.T, prog string) {
output := runTestProg(t, prog, "LockOSThreadMain", "GOMAXPROCS=1")
want := "OK\n"
if output != want {
t.Errorf("want %s, got %s\n", want, output)
}
output = runTestProg(t, prog, "LockOSThreadAlt")
if output != want {
t.Errorf("want %s, got %s\n", want, output)
}
}