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
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
sys·exitsyscall(void)
{
lock(&sched);
+ if(sched.predawn) {
+ unlock(&sched);
+ return;
+ }
g->status = Grunning;
sched.msyscall--;
sched.mcpu++;
--- /dev/null
+// $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() {
+}
+