mheap_.pagesSwept.Store(0)
mheap_.sweepArenas = mheap_.allArenas
mheap_.reclaimIndex.Store(0)
- mheap_.reclaimCredit = 0
+ mheap_.reclaimCredit.Store(0)
unlock(&mheap_.lock)
sweep.centralIndex.clear()
// Whole span was freed. Count it toward the
// page reclaimer credit since these pages can
// now be used for span allocation.
- atomic.Xadduintptr(&mheap_.reclaimCredit, npages)
+ mheap_.reclaimCredit.Add(npages)
} else {
// Span is still in-use, so this returned no
// pages to the heap and the span needs to
// If this is >= 1<<63, the page reclaimer is done scanning
// the page marks.
reclaimIndex atomic.Uint64
+
// reclaimCredit is spare credit for extra pages swept. Since
// the page reclaimer works in large chunks, it may reclaim
// more than requested. Any spare pages released go to this
// credit pool.
- //
- // This is accessed atomically.
- reclaimCredit uintptr
+ reclaimCredit atomic.Uintptr
// arenas is the heap arena map. It points to the metadata for
// the heap for every arena frame of the entire usable virtual
locked := false
for npage > 0 {
// Pull from accumulated credit first.
- if credit := atomic.Loaduintptr(&h.reclaimCredit); credit > 0 {
+ if credit := h.reclaimCredit.Load(); credit > 0 {
take := credit
if take > npage {
// Take only what we need.
take = npage
}
- if atomic.Casuintptr(&h.reclaimCredit, credit, credit-take) {
+ if h.reclaimCredit.CompareAndSwap(credit, credit-take) {
npage -= take
}
continue
npage -= nfound
} else {
// Put spare pages toward global credit.
- atomic.Xadduintptr(&h.reclaimCredit, nfound-npage)
+ h.reclaimCredit.Add(nfound - npage)
npage = 0
}
}