Permalink
Browse files

runtime: don't clear pointer-free memory when growing maps

If there are no pointers, then clearing memory doesn't help GC,
and the memory is otherwise dead, so don't bother clearing it.

Change-Id: I953f4a3264939f2825e82292030eda2e835cbb97
Reviewed-on: https://go-review.googlesource.com/57350
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Martin Möhrmann <moehrmann@google.com>
  • Loading branch information...
josharian committed Aug 19, 2017
1 parent ff90f4a commit 3f972df4a7f4be5db219ebd22625594711b68255
Showing with 4 additions and 8 deletions.
  1. +4 −8 src/runtime/hashmap.go
View
@@ -1124,17 +1124,13 @@ func evacuate(t *maptype, h *hmap, oldbucket uintptr) {
}
}
// Unlink the overflow buckets & clear key/value to help GC.
if h.flags&oldIterator == 0 {
b = (*bmap)(add(h.oldbuckets, oldbucket*uintptr(t.bucketsize)))
if h.flags&oldIterator == 0 && t.bucket.kind&kindNoPointers == 0 {
b := add(h.oldbuckets, oldbucket*uintptr(t.bucketsize))
// Preserve b.tophash because the evacuation
// state is maintained there.
ptr := add(unsafe.Pointer(b), dataOffset)
ptr := add(b, dataOffset)
n := uintptr(t.bucketsize) - dataOffset
if t.bucket.kind&kindNoPointers == 0 {
memclrHasPointers(ptr, n)
} else {
memclrNoHeapPointers(ptr, n)
}
memclrHasPointers(ptr, n)
}
}

0 comments on commit 3f972df

Please sign in to comment.