Use an iterator to skip through dirty chunks

This commit is contained in:
Matt Joiner 2021-09-21 10:48:15 +10:00
parent 40b0f9ca1e
commit ad70a761ec
1 changed files with 24 additions and 1 deletions

View File

@ -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