diff --git a/src/runtime/debug.go b/src/runtime/debug.go index bdaaa7196d3..c7592d33299 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 915e3c4dad4..99bc9f1dbb3 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") }