From: Hector Chu Date: Fri, 29 Jul 2011 21:39:02 +0000 (-0400) Subject: runtime: fix scheduling race X-Git-Tag: weekly.2011-07-29~1 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=9bc58accce0ab83dab6ca08f0cc319e75f7dd889;p=gostls13.git runtime: fix scheduling race Affects programs using cgo or runtime.LockOSThread. Fixes #2100. R=rsc, dvyukov CC=golang-dev https://golang.org/cl/4810059 --- diff --git a/src/pkg/runtime/proc.c b/src/pkg/runtime/proc.c index ffaf44ddd8..6d8f6990b2 100644 --- a/src/pkg/runtime/proc.c +++ b/src/pkg/runtime/proc.c @@ -486,8 +486,16 @@ nextgandunlock(void) // We can only run one g, and it's not available. // Make sure some other cpu is running to handle // the ordinary run queue. - if(runtime·sched.gwait != 0) + if(runtime·sched.gwait != 0) { matchmg(); + // m->lockedg might have been on the queue. + if(m->nextg != nil) { + gp = m->nextg; + m->nextg = nil; + schedunlock(); + return gp; + } + } } else { // Look for work on global queue. while(haveg() && canaddmcpu()) {