eth/enode: simplify BufferIter

Signed-off-by: Csaba Kiraly <csaba.kiraly@gmail.com>
This commit is contained in:
Csaba Kiraly 2025-04-28 15:09:54 +02:00
parent fab2459f13
commit c29688a255
No known key found for this signature in database
GPG key ID: 0FE274EE8C95166E

View file

@ -239,7 +239,7 @@ type BufferIter struct {
buffer chan *Node buffer chan *Node
head *Node head *Node
closed chan struct{} closed chan struct{}
mu sync.Mutex closeOnce sync.Once
} }
// NewBufferIter creates a new pre-fetch buffer of a given size. // 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 { func (b *BufferIter) Next() bool {
b.mu.Lock()
defer b.mu.Unlock()
select { select {
case b.head = <-b.buffer: case b.head = <-b.buffer:
case <-b.closed: case <-b.closed:
return false b.head = nil
} }
return b.head != nil return b.head != nil
} }
func (b *BufferIter) Node() *Node { func (b *BufferIter) Node() *Node {
b.mu.Lock()
defer b.mu.Unlock()
return b.head return b.head
} }
func (b *BufferIter) Close() { func (b *BufferIter) Close() {
// Close the wrapped iterator first. b.closeOnce.Do(func() {
b.it.Close() b.it.Close()
close(b.closed) close(b.closed)
// Wait for Next to terminate, then drain the buffer. // Wait for Next to terminate.
b.mu.Lock()
defer b.mu.Unlock()
for range b.buffer { for range b.buffer {
} }
b.buffer = nil })
b.head = nil
b.it = nil
} }
// FairMix aggregates multiple node iterators. The mixer itself is an iterator which ends // FairMix aggregates multiple node iterators. The mixer itself is an iterator which ends