aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/mheap.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime/mheap.go')
-rw-r--r--src/runtime/mheap.go14
1 files changed, 8 insertions, 6 deletions
diff --git a/src/runtime/mheap.go b/src/runtime/mheap.go
index 9d7d683cd1..f5b5ba99b8 100644
--- a/src/runtime/mheap.go
+++ b/src/runtime/mheap.go
@@ -1287,7 +1287,7 @@ func (h *mheap) scavengeLargest(nbytes uintptr) {
// Iterate over the treap backwards (from largest to smallest) scavenging spans
// until we've reached our quota of nbytes.
released := uintptr(0)
- for t := h.free.rev(); released < nbytes && t.valid(); {
+ for t := h.free.end(); released < nbytes && t.valid(); {
s := t.span()
r := s.scavenge()
if r == 0 {
@@ -1302,7 +1302,9 @@ func (h *mheap) scavengeLargest(nbytes uintptr) {
// those which have it unset are only in the `free` treap.
return
}
- t = h.free.erase(t)
+ n := t.prev()
+ h.free.erase(t)
+ t = n
h.scav.insert(s)
released += r
}
@@ -1314,18 +1316,18 @@ func (h *mheap) scavengeLargest(nbytes uintptr) {
func (h *mheap) scavengeAll(now, limit uint64) uintptr {
// Iterate over the treap scavenging spans if unused for at least limit time.
released := uintptr(0)
- for t := h.free.iter(); t.valid(); {
+ for t := h.free.start(); t.valid(); {
s := t.span()
+ n := t.next()
if (now - uint64(s.unusedsince)) > limit {
r := s.scavenge()
if r != 0 {
- t = h.free.erase(t)
+ h.free.erase(t)
h.scav.insert(s)
released += r
- continue
}
}
- t = t.next()
+ t = n
}
return released
}