aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/runtime/debug.go8
-rw-r--r--src/runtime/testdata/testprog/gomaxprocs.go14
2 files changed, 21 insertions, 1 deletions
diff --git a/src/runtime/debug.go b/src/runtime/debug.go
index bdaaa7196d..c7592d3329 100644
--- a/src/runtime/debug.go
+++ b/src/runtime/debug.go
@@ -39,7 +39,7 @@ func GOMAXPROCS(n int) int {
lock(&sched.lock)
ret := int(gomaxprocs)
- if n <= 0 || n == ret {
+ if n <= 0 {
unlock(&sched.lock)
return ret
}
@@ -52,6 +52,12 @@ func GOMAXPROCS(n int) int {
lock(&computeMaxProcsLock)
unlock(&computeMaxProcsLock)
+ if n == ret {
+ // sched.customGOMAXPROCS set, but no need to actually STW
+ // since the gomaxprocs itself isn't changing.
+ return ret
+ }
+
stw := stopTheWorldGC(stwGOMAXPROCS)
// newprocs will be processed by startTheWorld
diff --git a/src/runtime/testdata/testprog/gomaxprocs.go b/src/runtime/testdata/testprog/gomaxprocs.go
index 915e3c4dad..99bc9f1dbb 100644
--- a/src/runtime/testdata/testprog/gomaxprocs.go
+++ b/src/runtime/testdata/testprog/gomaxprocs.go
@@ -133,6 +133,20 @@ func UpdateGOMAXPROCS() {
mustSetCPUMax(path, 200000)
mustNotChangeMaxProcs(3)
+ // Re-enable updates. Change is immediately visible.
+ runtime.SetDefaultGOMAXPROCS()
+ procs = runtime.GOMAXPROCS(0)
+ println("GOMAXPROCS:", procs)
+ if procs != 2 {
+ panic(fmt.Sprintf("GOMAXPROCS got %d want %d", procs, 2))
+ }
+
+ // Setting GOMAXPROCS to itself also disables updates, despite not
+ // changing the value itself.
+ runtime.GOMAXPROCS(runtime.GOMAXPROCS(0))
+ mustSetCPUMax(path, 300000)
+ mustNotChangeMaxProcs(2)
+
println("OK")
}