mirror of
https://github.com/golang/go
synced 2024-11-24 23:57:57 -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:
parent
6c3befc824
commit
88ce9ce40c
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user