This patch to libgo clears the isSystemGoroutine field of the g structure when the goroutine exits. Otherwise it may be set when the g structure is reused via gfput/gfget. Bootstrapped and ran Go testsuite on x86_64-pc-linux-gnu. Committed to mainline.
Ian
Index: gcc/go/gofrontend/MERGE =================================================================== --- gcc/go/gofrontend/MERGE (revision 249138) +++ gcc/go/gofrontend/MERGE (working copy) @@ -1,4 +1,4 @@ -908fc7e46ebe36658ed86b65a3d165fccb2e8576 +3b44ad058abda0d1b0b6c928987270da50ab7431 The first line of this file holds the git revision number of the last merge done from the gofrontend repository. Index: libgo/go/runtime/proc.go =================================================================== --- libgo/go/runtime/proc.go (revision 249138) +++ libgo/go/runtime/proc.go (working copy) @@ -2251,6 +2251,7 @@ func goexit0(gp *g) { casgstatus(gp, _Grunning, _Gdead) if isSystemGoroutine(gp) { atomic.Xadd(&sched.ngsys, -1) + gp.isSystemGoroutine = false } gp.m = nil gp.lockedm = nil