The runtime_gc function in libgo invokes the garbage collector proper on
the g0 thread (a thread with a large stack that is not involved in
scheduling).  This is done via runtime_mcall.  Upon return from
runtime_mcall, the caller may be running on a different thread.
Unfortunately, the runtime_gc function called runtime_m to get the Go
thread info, and did not refresh that value after calling
runtime_mcall.  The result mostly worked, but could fail in very busy
program doing lots of work that started going as soon as the GC
stopped.  This patch fixes the problem.  Bootstrapped and ran Go
testsuite on x86_64-unknown-linux-gnu.  Committed to mainline and 4.9
branch.

Ian

diff -r 52dcc874d3b7 libgo/runtime/mgc0.c
--- a/libgo/runtime/mgc0.c	Wed Aug 13 14:52:52 2014 -0700
+++ b/libgo/runtime/mgc0.c	Fri Aug 15 15:07:02 2014 -0700
@@ -2204,6 +2204,7 @@
 		g->status = Gwaiting;
 		g->waitreason = "garbage collection";
 		runtime_mcall(mgc);
+		m = runtime_m();
 	}
 
 	// all done

Reply via email to