mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: redo heap bitmap
[this is a retry of CL 407035 + its revert CL 422395. The content is unchanged] Use just 1 bit per word to record the ptr/nonptr bitmap. Use word-sized operations to manipulate the bitmap, so we can operate on up to 64 ptr/nonptr bits at a time. Use a separate bitmap, one bit per word of the ptr/nonptr bitmap, to encode a no-more-pointers signal. Since we can check 64 ptr/nonptr bits at once, knowing the exact last pointer location is not necessary. As a followon CL, we should make the gcdata bitmap an array of uintptr instead of an array of byte, so we can load 64 bits of it at once. Similarly for the processing of gc programs. Change-Id: Ica5eb622f5b87e647be64f471d67b02732ef8be6 Reviewed-on: https://go-review.googlesource.com/c/go/+/422634 Reviewed-by: Michael Knyszek <mknyszek@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Keith Randall <khr@google.com> Run-TryBot: Keith Randall <khr@golang.org>
This commit is contained in:
parent
a55793835f
commit
6a9c674a09
12 changed files with 537 additions and 1133 deletions
|
|
@ -260,12 +260,14 @@ func growslice(et *_type, old slice, cap int) slice {
|
|||
capmem = roundupsize(uintptr(newcap) << shift)
|
||||
overflow = uintptr(newcap) > (maxAlloc >> shift)
|
||||
newcap = int(capmem >> shift)
|
||||
capmem = uintptr(newcap) << shift
|
||||
default:
|
||||
lenmem = uintptr(old.len) * et.size
|
||||
newlenmem = uintptr(cap) * et.size
|
||||
capmem, overflow = math.MulUintptr(et.size, uintptr(newcap))
|
||||
capmem = roundupsize(capmem)
|
||||
newcap = int(capmem / et.size)
|
||||
capmem = uintptr(newcap) * et.size
|
||||
}
|
||||
|
||||
// The check of overflow in addition to capmem > maxAlloc is needed
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue