1
0
mirror of https://github.com/golang/go synced 2024-11-21 15:34:45 -07:00

runtime: two proc bug fixes

1. Fix bug in GOMAXPROCS when trying to cut number of procs
Race could happen on any system but was
manifesting only on Xen hosted Linux.

2. Fix recover on ARM, where FP != caller SP.

R=r
CC=golang-dev
https://golang.org/cl/880043
This commit is contained in:
Russ Cox 2010-04-06 13:48:31 -07:00
parent 6c3befc824
commit 88ce9ce40c
2 changed files with 18 additions and 6 deletions

View File

@ -352,6 +352,10 @@ stoptheworld(void)
gcwaiting = 1;
sched.mcpumax = 1;
while(sched.mcpu > 1) {
// It would be unsafe for multiple threads to be using
// the stopped note at once, but there is only
// ever one thread doing garbage collection,
// so this is okay.
noteclear(&sched.stopped);
sched.waitstop = 1;
unlock(&sched);
@ -989,6 +993,8 @@ void
Stktop *top, *oldtop;
Panic *p;
fp = getcallersp(fp);
// Must be a panic going on.
if((p = g->panic) == nil || p->recovered)
goto nomatch;
@ -1113,13 +1119,14 @@ void
lock(&sched);
sched.gomaxprocs = n;
sched.mcpumax = n;
// handle fewer procs
while(sched.mcpu > sched.mcpumax) {
noteclear(&sched.stopped);
sched.waitstop = 1;
// handle fewer procs?
if(sched.mcpu > sched.mcpumax) {
unlock(&sched);
notesleep(&sched.stopped);
lock(&sched);
// just give up the cpu.
// we'll only get rescheduled once the
// number has come down.
gosched();
return;
}
// handle more procs
matchmg();

View File

@ -15,6 +15,7 @@ package main
import (
"os"
"strings"
"syscall"
)
var x = make([]byte, 10)
@ -80,6 +81,10 @@ func test6() {
}
func test7() {
if syscall.ARCH == "arm" {
// ARM doesn't have floating point yet
return
}
defer mustRecover("complex divide by zero")
var x, y complex
println(x / y)