From ad70a761ec5d0af9da1fd9f212a4dd2c7b780113 Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Tue, 21 Sep 2021 10:48:15 +1000 Subject: [PATCH] Use an iterator to skip through dirty chunks --- piece.go | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/piece.go b/piece.go index 7424bba4..bd107144 100644 --- a/piece.go +++ b/piece.go @@ -237,7 +237,30 @@ func (p *Piece) State() PieceState { return p.t.PieceState(p.index) } -func (p *Piece) iterUndirtiedChunks(f func(cs chunkIndexType)) { +func (p *Piece) iterUndirtiedChunks(f func(chunkIndexType)) { + // Use an iterator to jump between dirty bits. + if true { + it := p.t.dirtyChunks.Iterator() + startIndex := p.requestIndexOffset() + endIndex := startIndex + p.numChunks() + it.AdvanceIfNeeded(startIndex) + lastDirty := startIndex - 1 + for it.HasNext() { + next := it.Next() + if next >= endIndex { + break + } + for index := lastDirty + 1; index < next; index++ { + f(index - startIndex) + } + lastDirty = next + } + for index := lastDirty + 1; index < endIndex; index++ { + f(index - startIndex) + } + return + } + // The original implementation. for i := chunkIndexType(0); i < p.numChunks(); i++ { if p.chunkIndexDirty(i) { continue -- 2.48.1