Skip to content

Commit 2f99e88

Browse files
mknyszekaclements
authored andcommitted
runtime: de-duplicate coalescing code
Currently the code surrounding coalescing is duplicated between merging with the span before the span considered for coalescing and merging with the span after. This change factors out the shared portions of these codepaths into a local closure which acts as a helper. Change-Id: I7919fbed3f9a833eafb324a21a4beaa81f2eaa91 Reviewed-on: https://go-review.googlesource.com/c/158077 Run-TryBot: Michael Knyszek <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Austin Clements <[email protected]>
1 parent 79ac638 commit 2f99e88

File tree

1 file changed

+25
-25
lines changed

1 file changed

+25
-25
lines changed

src/runtime/mheap.go

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -425,41 +425,41 @@ func (h *mheap) coalesce(s *mspan) {
425425
needsScavenge := false
426426
prescavenged := s.released() // number of bytes already scavenged.
427427

428-
// Coalesce with earlier, later spans.
429-
if before := spanOf(s.base() - 1); before != nil && before.state == mSpanFree {
430-
// Now adjust s.
431-
s.startAddr = before.startAddr
432-
s.npages += before.npages
433-
s.needzero |= before.needzero
434-
h.setSpan(before.base(), s)
428+
// merge is a helper which merges other into s, deletes references to other
429+
// in heap metadata, and then discards it.
430+
merge := func(other *mspan) {
431+
// Adjust s via base and npages.
432+
if other.startAddr < s.startAddr {
433+
s.startAddr = other.startAddr
434+
}
435+
s.npages += other.npages
436+
s.needzero |= other.needzero
437+
435438
// If before or s are scavenged, then we need to scavenge the final coalesced span.
436-
needsScavenge = needsScavenge || before.scavenged || s.scavenged
437-
prescavenged += before.released()
439+
needsScavenge = needsScavenge || other.scavenged || s.scavenged
440+
prescavenged += other.released()
441+
438442
// The size is potentially changing so the treap needs to delete adjacent nodes and
439443
// insert back as a combined node.
440-
if before.scavenged {
441-
h.scav.removeSpan(before)
444+
if other.scavenged {
445+
h.scav.removeSpan(other)
442446
} else {
443-
h.free.removeSpan(before)
447+
h.free.removeSpan(other)
444448
}
445-
before.state = mSpanDead
446-
h.spanalloc.free(unsafe.Pointer(before))
449+
other.state = mSpanDead
450+
h.spanalloc.free(unsafe.Pointer(other))
451+
}
452+
453+
// Coalesce with earlier, later spans.
454+
if before := spanOf(s.base() - 1); before != nil && before.state == mSpanFree {
455+
merge(before)
456+
h.setSpan(s.base(), s)
447457
}
448458

449459
// Now check to see if next (greater addresses) span is free and can be coalesced.
450460
if after := spanOf(s.base() + s.npages*pageSize); after != nil && after.state == mSpanFree {
451-
s.npages += after.npages
452-
s.needzero |= after.needzero
461+
merge(after)
453462
h.setSpan(s.base()+s.npages*pageSize-1, s)
454-
needsScavenge = needsScavenge || after.scavenged || s.scavenged
455-
prescavenged += after.released()
456-
if after.scavenged {
457-
h.scav.removeSpan(after)
458-
} else {
459-
h.free.removeSpan(after)
460-
}
461-
after.state = mSpanDead
462-
h.spanalloc.free(unsafe.Pointer(after))
463463
}
464464

465465
if needsScavenge {

0 commit comments

Comments
 (0)