aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRémy Oudompheng <oudomphe@phare.normalesup.org>2012-03-05 16:40:27 -0500
committerRuss Cox <rsc@golang.org>2012-03-05 16:40:27 -0500
commitaa1aaee7fd96a76e595add58b9889b4cd6703d3a (patch)
tree5acb6660fcdc1a8c7bc204adde4c6d2c4a3dca89 /src
parent610b5b2fd8a31ac3855088a0ea2aece8d88d7521 (diff)
downloadgo-aa1aaee7fd96a76e595add58b9889b4cd6703d3a.tar.xz
runtime: wait for main goroutine before setting GOMAXPROCS.
Fixes #3182. R=golang-dev, dvyukov, rsc CC=golang-dev, remy https://golang.org/cl/5732057
Diffstat (limited to 'src')
-rw-r--r--src/pkg/runtime/proc.c6
-rwxr-xr-xsrc/run.bash4
2 files changed, 7 insertions, 3 deletions
diff --git a/src/pkg/runtime/proc.c b/src/pkg/runtime/proc.c
index de7090c527..88e2b61388 100644
--- a/src/pkg/runtime/proc.c
+++ b/src/pkg/runtime/proc.c
@@ -200,7 +200,9 @@ runtime·schedinit(void)
n = maxgomaxprocs;
runtime·gomaxprocs = n;
}
- setmcpumax(runtime·gomaxprocs);
+ // wait for the main goroutine to start before taking
+ // GOMAXPROCS into account.
+ setmcpumax(1);
runtime·singleproc = runtime·gomaxprocs == 1;
canaddmcpu(); // mcpu++ to account for bootstrap m
@@ -225,6 +227,8 @@ runtime·main(void)
// by calling runtime.LockOSThread during initialization
// to preserve the lock.
runtime·LockOSThread();
+ // From now on, newgoroutines may use non-main threads.
+ setmcpumax(runtime·gomaxprocs);
runtime·sched.init = true;
scvg = runtime·newproc1((byte*)runtime·MHeap_Scavenger, nil, 0, 0, runtime·main);
main·init();
diff --git a/src/run.bash b/src/run.bash
index fd3b1f27b7..fdbf47663b 100755
--- a/src/run.bash
+++ b/src/run.bash
@@ -26,8 +26,8 @@ echo '# Testing packages.'
time go test std -short -timeout=120s
echo
-echo '# runtime -cpu=1,2,4'
-go test runtime -short -timeout=120s -cpu=1,2,4
+echo '# GOMAXPROCS=2 runtime -cpu=1,2,4'
+GOMAXPROCS=2 go test runtime -short -timeout=120s -cpu=1,2,4
echo
echo '# sync -cpu=10'