Commit 052a66ba authored by Russ Cox's avatar Russ Cox

runtime: fix init scheduling bug.

if there is a goroutine waiting to run
and the init goroutine enters a system call,
entersyscall was trying to kick off a new
scheduler for the other goroutine, causing
a panic (new goroutines can't run until main.main).

R=r
DELTA=32  (32 added, 0 deleted, 0 changed)
OCL=31982
CL=31982
parent 335b3855
......@@ -478,6 +478,10 @@ sys·entersyscall(uint64 callerpc, int64 trap)
USED(callerpc, trap);
lock(&sched);
if(sched.predawn) {
unlock(&sched);
return;
}
g->status = Gsyscall;
// Leave SP around for gc and traceback.
// Do before notewakeup so that gc
......@@ -502,6 +506,10 @@ void
sys·exitsyscall(void)
{
lock(&sched);
if(sched.predawn) {
unlock(&sched);
return;
}
g->status = Grunning;
sched.msyscall--;
sched.mcpu++;
......
// $G $D/$F.go && $L $F.$A && ./$A.out
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// This used to crash because the scheduler
// tried to kick off a new scheduling thread for f
// when time.Nanoseconds went into the system call.
// It's not okay to schedule new goroutines
// until main has started.
package main
import "log"
import "time"
func f() {
}
func init() {
go f();
time.Nanoseconds();
}
func main() {
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment