mirror of
https://github.com/golang/go
synced 2024-11-19 14:24:47 -07:00
runtime: refactor hmap setoverflow into newoverflow
This simplifies the code, as well as providing a single place to modify to change the allocation of new overflow buckets. Updates #19931 Updates #19992 Change-Id: I77070619f5c8fe449bbc35278278bca5eda780f2 Reviewed-on: https://go-review.googlesource.com/40975 Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
parent
dc444418d9
commit
619af17205
@ -196,13 +196,15 @@ func (h *hmap) incrnoverflow() {
|
||||
}
|
||||
}
|
||||
|
||||
func (h *hmap) setoverflow(t *maptype, b, ovf *bmap) {
|
||||
func (h *hmap) newoverflow(t *maptype, b *bmap) *bmap {
|
||||
ovf := (*bmap)(newobject(t.bucket))
|
||||
h.incrnoverflow()
|
||||
if t.bucket.kind&kindNoPointers != 0 {
|
||||
h.createOverflow()
|
||||
*h.overflow[0] = append(*h.overflow[0], ovf)
|
||||
}
|
||||
*(**bmap)(add(unsafe.Pointer(b), uintptr(t.bucketsize)-sys.PtrSize)) = ovf
|
||||
return ovf
|
||||
}
|
||||
|
||||
func (h *hmap) createOverflow() {
|
||||
@ -565,8 +567,7 @@ again:
|
||||
|
||||
if inserti == nil {
|
||||
// all current buckets are full, allocate a new one.
|
||||
newb := (*bmap)(newobject(t.bucket))
|
||||
h.setoverflow(t, b, newb)
|
||||
newb := h.newoverflow(t, b)
|
||||
inserti = &newb.tophash[0]
|
||||
insertk = add(unsafe.Pointer(newb), dataOffset)
|
||||
val = add(insertk, bucketCnt*uintptr(t.keysize))
|
||||
@ -1045,8 +1046,7 @@ func evacuate(t *maptype, h *hmap, oldbucket uintptr) {
|
||||
if useX {
|
||||
b.tophash[i] = evacuatedX
|
||||
if xi == bucketCnt {
|
||||
newx := (*bmap)(newobject(t.bucket))
|
||||
h.setoverflow(t, x, newx)
|
||||
newx := h.newoverflow(t, x)
|
||||
x = newx
|
||||
xi = 0
|
||||
xk = add(unsafe.Pointer(x), dataOffset)
|
||||
@ -1069,8 +1069,7 @@ func evacuate(t *maptype, h *hmap, oldbucket uintptr) {
|
||||
} else {
|
||||
b.tophash[i] = evacuatedY
|
||||
if yi == bucketCnt {
|
||||
newy := (*bmap)(newobject(t.bucket))
|
||||
h.setoverflow(t, y, newy)
|
||||
newy := h.newoverflow(t, y)
|
||||
y = newy
|
||||
yi = 0
|
||||
yk = add(unsafe.Pointer(y), dataOffset)
|
||||
|
@ -490,8 +490,7 @@ again:
|
||||
|
||||
if inserti == nil {
|
||||
// all current buckets are full, allocate a new one.
|
||||
newb := (*bmap)(newobject(t.bucket))
|
||||
h.setoverflow(t, b, newb)
|
||||
newb := h.newoverflow(t, b)
|
||||
inserti = &newb.tophash[0]
|
||||
insertk = add(unsafe.Pointer(newb), dataOffset)
|
||||
val = add(insertk, bucketCnt*4)
|
||||
@ -579,8 +578,7 @@ again:
|
||||
|
||||
if inserti == nil {
|
||||
// all current buckets are full, allocate a new one.
|
||||
newb := (*bmap)(newobject(t.bucket))
|
||||
h.setoverflow(t, b, newb)
|
||||
newb := h.newoverflow(t, b)
|
||||
inserti = &newb.tophash[0]
|
||||
insertk = add(unsafe.Pointer(newb), dataOffset)
|
||||
val = add(insertk, bucketCnt*8)
|
||||
@ -673,8 +671,7 @@ again:
|
||||
|
||||
if inserti == nil {
|
||||
// all current buckets are full, allocate a new one.
|
||||
newb := (*bmap)(newobject(t.bucket))
|
||||
h.setoverflow(t, b, newb)
|
||||
newb := h.newoverflow(t, b)
|
||||
inserti = &newb.tophash[0]
|
||||
insertk = add(unsafe.Pointer(newb), dataOffset)
|
||||
val = add(insertk, bucketCnt*2*sys.PtrSize)
|
||||
|
Loading…
Reference in New Issue
Block a user