runtime: check for preemption due to garbage collection

in various already expensive routines.

helps keep cpu utilization up when GOMAXPROCS > 1,
but not a full solution.

http://groups.google.com/group/golang-nuts/t/7a9535c4136d3e2

R=r
CC=golang-dev
https://golang.org/cl/184043
This commit is contained in:
Russ Cox 2010-01-09 09:47:45 -08:00
parent 752b1702d0
commit 5328df6534
6 changed files with 29 additions and 2 deletions

View file

@ -14,6 +14,8 @@ G g0; // idle goroutine for m0
static int32 debug = 0;
int32 gcwaiting;
// Go scheduler
//
// The go scheduler's job is to match ready-to-run goroutines (`g's)
@ -362,6 +364,7 @@ void
stoptheworld(void)
{
lock(&sched);
gcwaiting = 1;
sched.mcpumax = 1;
while(sched.mcpu > 1) {
noteclear(&sched.stopped);
@ -379,6 +382,7 @@ void
starttheworld(void)
{
lock(&sched);
gcwaiting = 0;
sched.mcpumax = sched.gomaxprocs;
matchmg();
unlock(&sched);