]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: refactor hmap setoverflow into newoverflow
authorJosh Bleecher Snyder <josharian@gmail.com>
Thu, 13 Apr 2017 12:25:20 +0000 (05:25 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Wed, 19 Apr 2017 13:41:44 +0000 (13:41 +0000)
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>
src/runtime/hashmap.go
src/runtime/hashmap_fast.go

index 9b214a3ac23b7b5825c50fd112e637fcecb4fdc1..4b958605fdced8c2560afee9118b5ba3e1d03570 100644 (file)
@@ -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)
index 0a625cca56c921687acc24ff74edd9f9488dc31a..ebba001d46bd4387110caea5f4e73566eae061ed 100644 (file)
@@ -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)