File tree 1 file changed +18
-6
lines changed
1 file changed +18
-6
lines changed Original file line number Diff line number Diff line change @@ -204,26 +204,39 @@ type BufferIter struct {
204
204
it Iterator
205
205
buffer chan * Node
206
206
head * Node
207
+ closed chan struct {}
207
208
}
208
209
209
- // NewBufferIter creates a new pre-fetch buffer.
210
+ // NewBufferIter creates a new pre-fetch buffer of a given size .
210
211
func NewBufferIter (it Iterator , size int ) * BufferIter {
211
212
b := BufferIter {
212
213
it : it ,
213
214
buffer : make (chan * Node , size ),
215
+ head : nil ,
216
+ closed : make (chan struct {}),
214
217
}
215
218
216
219
go func () {
220
+ // if the wrapped iterator ends, the buffer content will still be served.
217
221
defer close (b .buffer )
222
+ // If instead the bufferIterator is closed, we bail out of the loop.
218
223
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
+ }
220
229
}
221
230
}()
222
231
return & b
223
232
}
224
233
225
234
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
+ }
227
240
return b .head != nil
228
241
}
229
242
@@ -232,12 +245,11 @@ func (b *BufferIter) Node() *Node {
232
245
}
233
246
234
247
func (b * BufferIter ) Close () {
248
+ // Close the wrapped iterator first.
235
249
b .it .Close ()
236
- // Wait for the buffer to be consumed.
250
+ close ( b . closed )
237
251
for range b .buffer {
238
252
}
239
- // Close the buffer channel.
240
- // close(b.buffer)
241
253
b .buffer = nil
242
254
b .head = nil
243
255
b .it = nil
You can’t perform that action at this time.
0 commit comments