1
0
mirror of https://github.com/golang/go synced 2024-11-25 12:57:58 -07:00

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
This commit is contained in:
Russ Cox 2009-07-21 19:43:27 -07:00
parent 335b3855c6
commit 052a66babd
2 changed files with 36 additions and 0 deletions

View 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++;

28
test/initsyscall.go Normal file
View File

@ -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() {
}