From: Matt Joiner Date: Tue, 21 Sep 2021 00:48:15 +0000 (+1000) Subject: Use an iterator to skip through dirty chunks X-Git-Tag: v1.32.0~25 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=ad70a761ec5d0af9da1fd9f212a4dd2c7b780113;p=btrtrc.git Use an iterator to skip through dirty chunks --- 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