diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/runtime/mranges.go | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/src/runtime/mranges.go b/src/runtime/mranges.go index c2b8e7161c..e23d0778eb 100644 --- a/src/runtime/mranges.go +++ b/src/runtime/mranges.go @@ -69,6 +69,18 @@ func (a addrRange) subtract(b addrRange) addrRange { return a } +// removeGreaterEqual removes all addresses in a greater than or equal +// to addr and returns the new range. +func (a addrRange) removeGreaterEqual(addr uintptr) addrRange { + if (offAddr{addr}).lessEqual(a.base) { + return addrRange{} + } + if a.limit.lessEqual(offAddr{addr}) { + return a + } + return makeAddrRange(a.base.addr(), addr) +} + var ( // minOffAddr is the minimum address in the offset space, and // it corresponds to the virtual address arenaBaseOffset. @@ -281,7 +293,7 @@ func (a *addrRanges) removeGreaterEqual(addr uintptr) { } if r := a.ranges[pivot-1]; r.contains(addr) { removed += r.size() - r = r.subtract(makeAddrRange(addr, maxOffAddr.addr())) + r = r.removeGreaterEqual(addr) if r.size() == 0 { pivot-- } else { |
