]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix init scheduling bug.
authorRuss Cox <rsc@golang.org>
Wed, 22 Jul 2009 02:43:27 +0000 (19:43 -0700)
committerRuss Cox <rsc@golang.org>
Wed, 22 Jul 2009 02:43:27 +0000 (19:43 -0700)
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

src/pkg/runtime/proc.c
test/initsyscall.go [new file with mode: 0644]

index cffdf1b893f4545a4585462a4e8e11f0a4d8507f..3c8ef54fe73303f3e5c67dfdc6ca75ade10526de 100644 (file)
@@ -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++;
diff --git a/test/initsyscall.go b/test/initsyscall.go
new file mode 100644 (file)
index 0000000..7765de8
--- /dev/null
@@ -0,0 +1,28 @@
+// $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() {
+}
+