mirror of
https://github.com/golang/go.git
synced 2025-10-19 11:03:18 +00:00
runtime: fix condition to emit gcpacertrace end-of-sweep line
It's the job of the last sweeper to emit the GC pacer trace. The last sweeper can identify themselves by reducing the count of sweepers, and also seeing that there's no more sweep work. Currently this identification is broken, however, because the last sweeper doesn't check the state they just transitioned sweeping into, but rather the state they transitioned from (one sweeper, no sweep work left). By design, it's impossible to transition *out* of this state, except for another GC to start, but that doesn't take this codepath. This means lines like pacer: sweep done at heap size ... were missing from the gcpacertrace output for a long time. This change fixes this problem by having the last sweeper check the state they just transitioned sweeping to, instead of the state they transitioned from. Change-Id: I44bcd32fe2c8ae6ac6c21ba6feb2e7b9e17f60cc Reviewed-on: https://go-review.googlesource.com/c/go/+/670735 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Michael Pratt <mpratt@google.com>
This commit is contained in:
parent
509c11f3a3
commit
ad7a6f8159
1 changed files with 2 additions and 1 deletions
|
@ -169,9 +169,10 @@ func (a *activeSweep) end(sl sweepLocker) {
|
|||
throw("mismatched begin/end of activeSweep")
|
||||
}
|
||||
if a.state.CompareAndSwap(state, state-1) {
|
||||
if state != sweepDrainedMask {
|
||||
if state-1 != sweepDrainedMask {
|
||||
return
|
||||
}
|
||||
// We're the last sweeper, and there's nothing left to sweep.
|
||||
if debug.gcpacertrace > 0 {
|
||||
live := gcController.heapLive.Load()
|
||||
print("pacer: sweep done at heap size ", live>>20, "MB; allocated ", (live-mheap_.sweepHeapLiveBasis)>>20, "MB during sweep; swept ", mheap_.pagesSwept.Load(), " pages at ", mheap_.sweepPagesPerByte, " pages/byte\n")
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue