src/pkg/runtime/proc.c | 10 +++++++++- diff --git a/src/pkg/runtime/proc.c b/src/pkg/runtime/proc.c index ffaf44ddd8fb7ab2bb43d644f5d4ee358eae41dd..6d8f6990b2e64d489cd4c54c56eb6e0295cc451c 100644 --- a/src/pkg/runtime/proc.c +++ b/src/pkg/runtime/proc.c @@ -486,8 +486,16 @@ if(m->lockedg != nil) { // 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()) {