Commit 88ce9ce4 authored by Russ Cox's avatar Russ Cox

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
parent 6c3befc8
......@@ -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();
......
......@@ -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)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment