Commit 034d825e authored by Martin Möhrmann's avatar Martin Möhrmann

runtime: avoid redundant zeroing of hiter

The compiler and reflect already zero hiter before mapiterinit.

While here expand the documentation for mapiterinit.

Change-Id: I78b05d4d14bf78e8091e5353cdac80ffed30ca1e
Reviewed-on: https://go-review.googlesource.com/60673
Run-TryBot: Martin Möhrmann <moehrmann@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarKeith Randall <khr@golang.org>
parent 9c3f2685
...@@ -678,25 +678,17 @@ search: ...@@ -678,25 +678,17 @@ search:
h.flags &^= hashWriting h.flags &^= hashWriting
} }
// mapiterinit initializes the hiter struct used for ranging over maps.
// The hiter struct pointed to by 'it' is allocated on the stack
// by the compilers order pass or on the heap by reflect_mapiterinit.
// Both need to have zeroed hiter since the struct contains pointers.
func mapiterinit(t *maptype, h *hmap, it *hiter) { func mapiterinit(t *maptype, h *hmap, it *hiter) {
// Clear pointer fields so garbage collector does not complain.
it.key = nil
it.value = nil
it.t = nil
it.h = nil
it.buckets = nil
it.bptr = nil
it.overflow[0] = nil
it.overflow[1] = nil
if raceenabled && h != nil { if raceenabled && h != nil {
callerpc := getcallerpc(unsafe.Pointer(&t)) callerpc := getcallerpc(unsafe.Pointer(&t))
racereadpc(unsafe.Pointer(h), callerpc, funcPC(mapiterinit)) racereadpc(unsafe.Pointer(h), callerpc, funcPC(mapiterinit))
} }
if h == nil || h.count == 0 { if h == nil || h.count == 0 {
it.key = nil
it.value = nil
return return
} }
...@@ -728,11 +720,9 @@ func mapiterinit(t *maptype, h *hmap, it *hiter) { ...@@ -728,11 +720,9 @@ func mapiterinit(t *maptype, h *hmap, it *hiter) {
// iterator state // iterator state
it.bucket = it.startBucket it.bucket = it.startBucket
it.wrapped = false
it.bptr = nil
// Remember we have an iterator. // Remember we have an iterator.
// Can run concurrently with another hash_iter_init(). // Can run concurrently with another mapiterinit().
if old := h.flags; old&(iterator|oldIterator) != iterator|oldIterator { if old := h.flags; old&(iterator|oldIterator) != iterator|oldIterator {
atomic.Or8(&h.flags, iterator|oldIterator) atomic.Or8(&h.flags, iterator|oldIterator)
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment