From c29688a255b6c14098e4c8b0f91af1258f5ca235 Mon Sep 17 00:00:00 2001 From: Csaba Kiraly Date: Mon, 28 Apr 2025 15:09:54 +0200 Subject: [PATCH] eth/enode: simplify BufferIter Signed-off-by: Csaba Kiraly --- p2p/enode/iter.go | 35 +++++++++++++---------------------- 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/p2p/enode/iter.go b/p2p/enode/iter.go index feacef4063..1cc497a766 100644 --- a/p2p/enode/iter.go +++ b/p2p/enode/iter.go @@ -235,11 +235,11 @@ func (f *AsyncFilterIter) Close() { // BufferIter wraps an iterator and buffers the nodes it returns. // The buffer is pre-filled with the given size from the wrapped iterator. type BufferIter struct { - it Iterator - buffer chan *Node - head *Node - closed chan struct{} - mu sync.Mutex + it Iterator + buffer chan *Node + head *Node + closed chan struct{} + closeOnce sync.Once } // NewBufferIter creates a new pre-fetch buffer of a given size. @@ -267,35 +267,26 @@ func NewBufferIter(it Iterator, size int) Iterator { } func (b *BufferIter) Next() bool { - b.mu.Lock() - defer b.mu.Unlock() - select { case b.head = <-b.buffer: case <-b.closed: - return false + b.head = nil } return b.head != nil } func (b *BufferIter) Node() *Node { - b.mu.Lock() - defer b.mu.Unlock() return b.head } func (b *BufferIter) Close() { - // Close the wrapped iterator first. - b.it.Close() - close(b.closed) - // Wait for Next to terminate, then drain the buffer. - b.mu.Lock() - defer b.mu.Unlock() - for range b.buffer { - } - b.buffer = nil - b.head = nil - b.it = nil + b.closeOnce.Do(func() { + b.it.Close() + close(b.closed) + // Wait for Next to terminate. + for range b.buffer { + } + }) } // FairMix aggregates multiple node iterators. The mixer itself is an iterator which ends