Skip to content

Commit 021073e

Browse files
committed
p2p/enode: fixup BufferIterator
Signed-off-by: Csaba Kiraly <[email protected]>
1 parent 834c433 commit 021073e

File tree

1 file changed

+18
-6
lines changed

1 file changed

+18
-6
lines changed

Diff for: p2p/enode/iter.go

+18-6
Original file line numberDiff line numberDiff line change
@@ -204,26 +204,39 @@ type BufferIter struct {
204204
it Iterator
205205
buffer chan *Node
206206
head *Node
207+
closed chan struct{}
207208
}
208209

209-
// NewBufferIter creates a new pre-fetch buffer.
210+
// NewBufferIter creates a new pre-fetch buffer of a given size.
210211
func NewBufferIter(it Iterator, size int) *BufferIter {
211212
b := BufferIter{
212213
it: it,
213214
buffer: make(chan *Node, size),
215+
head: nil,
216+
closed: make(chan struct{}),
214217
}
215218

216219
go func() {
220+
// if the wrapped iterator ends, the buffer content will still be served.
217221
defer close(b.buffer)
222+
// If instead the bufferIterator is closed, we bail out of the loop.
218223
for b.it.Next() {
219-
b.buffer <- b.it.Node()
224+
select {
225+
case b.buffer <- b.it.Node():
226+
case <-b.closed:
227+
return
228+
}
220229
}
221230
}()
222231
return &b
223232
}
224233

225234
func (b *BufferIter) Next() bool {
226-
b.head = <-b.buffer
235+
select {
236+
case b.head = <-b.buffer:
237+
case <-b.closed:
238+
return false
239+
}
227240
return b.head != nil
228241
}
229242

@@ -232,12 +245,11 @@ func (b *BufferIter) Node() *Node {
232245
}
233246

234247
func (b *BufferIter) Close() {
248+
// Close the wrapped iterator first.
235249
b.it.Close()
236-
// Wait for the buffer to be consumed.
250+
close(b.closed)
237251
for range b.buffer {
238252
}
239-
// Close the buffer channel.
240-
// close(b.buffer)
241253
b.buffer = nil
242254
b.head = nil
243255
b.it = nil

0 commit comments

Comments
 (0)