mirror of
https://github.com/golang/go
synced 2024-10-02 04:18:33 -06:00
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: Keith Randall <khr@golang.org>
This commit is contained in:
parent
9c3f268558
commit
034d825ea3
@ -678,25 +678,17 @@ search:
|
||||
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) {
|
||||
// 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 {
|
||||
callerpc := getcallerpc(unsafe.Pointer(&t))
|
||||
racereadpc(unsafe.Pointer(h), callerpc, funcPC(mapiterinit))
|
||||
}
|
||||
|
||||
if h == nil || h.count == 0 {
|
||||
it.key = nil
|
||||
it.value = nil
|
||||
return
|
||||
}
|
||||
|
||||
@ -728,11 +720,9 @@ func mapiterinit(t *maptype, h *hmap, it *hiter) {
|
||||
|
||||
// iterator state
|
||||
it.bucket = it.startBucket
|
||||
it.wrapped = false
|
||||
it.bptr = nil
|
||||
|
||||
// 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 {
|
||||
atomic.Or8(&h.flags, iterator|oldIterator)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user