mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-20 10:52:25 +00:00
p2p/discutil: add Close to iterator interface
This commit is contained in:
parent
c592367d0b
commit
be439f4221
2 changed files with 19 additions and 2 deletions
|
|
@ -31,10 +31,13 @@ import (
|
|||
// node could be found before the context was canceled. The isLive return value reports
|
||||
// whether the iterator is still open. Once closed, iterators should keep returning (nil, false).
|
||||
//
|
||||
// Implementations are not required to be safe for concurrent use. It is therefore unsafe
|
||||
// to call NextNode from multiple goroutines at the same time.
|
||||
// Implementations of NextNode are not required to be safe for concurrent use. It is
|
||||
// therefore unsafe to call NextNode from multiple goroutines at the same time.
|
||||
//
|
||||
// Close may be called concurrently with NextNode, and interrupts NextNode.
|
||||
type Iterator interface {
|
||||
NextNode(ctx context.Context) (n *enode.Node, isLive bool)
|
||||
Close()
|
||||
}
|
||||
|
||||
// ReadNodes reads at most n nodes from the given iterator. The return value contains no
|
||||
|
|
@ -83,6 +86,10 @@ func (f *filterIter) NextNode(ctx context.Context) (*enode.Node, bool) {
|
|||
return n, isLive
|
||||
}
|
||||
|
||||
func (f *filterIter) Close() {
|
||||
f.it.Close()
|
||||
}
|
||||
|
||||
// FairMix aggregates multiple node iterators. The mixer itself is an iterator which ends
|
||||
// only when Close is called. Source iterators added via AddSource are removed from the mix
|
||||
// when they end.
|
||||
|
|
|
|||
|
|
@ -227,6 +227,8 @@ func (s *genIter) NextNode(ctx context.Context) (*enode.Node, bool) {
|
|||
return n, true
|
||||
}
|
||||
|
||||
func (s *genIter) Close() { panic("called") }
|
||||
|
||||
func testNode(id, seq uint64) *enode.Node {
|
||||
var nodeID enode.ID
|
||||
binary.BigEndian.PutUint64(nodeID[:], id)
|
||||
|
|
@ -253,6 +255,8 @@ func (s *blockedIter) NextNode(ctx context.Context) (*enode.Node, bool) {
|
|||
}
|
||||
}
|
||||
|
||||
func (s *blockedIter) Close() { panic("called") }
|
||||
|
||||
// cycleNodes is a never-ending interator that cycles through the given slice.
|
||||
type cycleNodes []*enode.Node
|
||||
|
||||
|
|
@ -267,6 +271,8 @@ func (s cycleNodes) NextNode(ctx context.Context) (*enode.Node, bool) {
|
|||
return n, true
|
||||
}
|
||||
|
||||
func (s cycleNodes) Close() { panic("called") }
|
||||
|
||||
// callCountIter counts calls to NextNode.
|
||||
type callCountIter struct {
|
||||
child Iterator
|
||||
|
|
@ -277,3 +283,7 @@ func (it *callCountIter) NextNode(ctx context.Context) (*enode.Node, bool) {
|
|||
it.count++
|
||||
return it.child.NextNode(ctx)
|
||||
}
|
||||
|
||||
func (it *callCountIter) Close() {
|
||||
it.child.Close()
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue