mirror of
https://github.com/golang/go
synced 2024-11-19 16:44:43 -07:00
runtime: consistently use atomic loads for heap_live
heap_live is updated atomically without locking, so we should also use atomic loads to read it. Fix the reads of heap_live that happen outside of STW to be atomic. Change-Id: Idca9451c348168c2a792a9499af349833a3c333f Reviewed-on: https://go-review.googlesource.com/41371 Run-TryBot: Austin Clements <austin@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Rick Hudson <rlh@golang.org>
This commit is contained in:
parent
44fe0820c6
commit
9d36163c0b
@ -537,7 +537,7 @@ func (c *gcControllerState) revise() {
|
||||
}
|
||||
|
||||
// Compute the heap distance remaining.
|
||||
heapDistance := int64(memstats.next_gc) - int64(memstats.heap_live)
|
||||
heapDistance := int64(memstats.next_gc) - int64(atomic.Load64(&memstats.heap_live))
|
||||
if heapDistance <= 0 {
|
||||
// This shouldn't happen, but if it does, avoid
|
||||
// dividing by zero or setting the assist negative.
|
||||
@ -1073,6 +1073,10 @@ func (t gcTrigger) test() bool {
|
||||
}
|
||||
switch t.kind {
|
||||
case gcTriggerHeap:
|
||||
// Non-atomic access to heap_live for performance. If
|
||||
// we are going to trigger on this, this thread just
|
||||
// atomically wrote heap_live anyway and we'll see our
|
||||
// own write.
|
||||
return memstats.heap_live >= memstats.gc_trigger
|
||||
case gcTriggerTime:
|
||||
lastgc := int64(atomic.Load64(&memstats.last_gc_nanotime))
|
||||
@ -1157,7 +1161,7 @@ func gcStart(mode gcMode, trigger gcTrigger) {
|
||||
now := nanotime()
|
||||
work.stwprocs, work.maxprocs = gcprocs(), gomaxprocs
|
||||
work.tSweepTerm = now
|
||||
work.heap0 = memstats.heap_live
|
||||
work.heap0 = atomic.Load64(&memstats.heap_live)
|
||||
work.pauseNS = 0
|
||||
work.mode = mode
|
||||
|
||||
@ -1985,7 +1989,7 @@ func gcResetMarkState() {
|
||||
unlock(&allglock)
|
||||
|
||||
work.bytesMarked = 0
|
||||
work.initialHeapLive = memstats.heap_live
|
||||
work.initialHeapLive = atomic.Load64(&memstats.heap_live)
|
||||
work.markrootDone = false
|
||||
}
|
||||
|
||||
|
@ -121,6 +121,8 @@ type mstats struct {
|
||||
// leads to a conservative GC rate rather than a GC rate that
|
||||
// is potentially too low.
|
||||
//
|
||||
// Reads should likewise be atomic (or during STW).
|
||||
//
|
||||
// Whenever this is updated, call traceHeapAlloc() and
|
||||
// gcController.revise().
|
||||
heap_live uint64
|
||||
|
Loading…
Reference in New Issue
Block a user