mirror of
https://github.com/golang/go
synced 2024-11-22 06:14:39 -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:
parent
335b3855c6
commit
052a66babd
@ -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
28
test/initsyscall.go
Normal 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() {
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user