"github.com/RoaringBitmap/roaring"
"github.com/anacrolix/chansync"
"github.com/anacrolix/missinggo/v2/bitmap"
- request_strategy "github.com/anacrolix/torrent/request-strategy"
"github.com/anacrolix/torrent/metainfo"
pp "github.com/anacrolix/torrent/peer_protocol"
// Connections that have written data to this piece since its last check.
// This can include connections that have closed.
dirtiers map[*Peer]struct{}
+
+ undirtiedChunksIter undirtiedChunksIter
}
func (p *Piece) String() string {
gob.Register(undirtiedChunksIter{})
}
+// Use an iterator to jump between dirty bits.
type undirtiedChunksIter struct {
TorrentDirtyChunks *roaring.Bitmap
StartRequestIndex RequestIndex
EndRequestIndex RequestIndex
}
-func (me undirtiedChunksIter) Iter(f func(chunkIndexType)) {
+func (me *undirtiedChunksIter) Iter(f func(chunkIndexType)) {
it := me.TorrentDirtyChunks.Iterator()
startIndex := me.StartRequestIndex
endIndex := me.EndRequestIndex
return
}
-func (p *Piece) undirtiedChunksIter() request_strategy.ChunksIter {
- // Use an iterator to jump between dirty bits.
- return undirtiedChunksIter{
- TorrentDirtyChunks: &p.t.dirtyChunks,
- StartRequestIndex: p.requestIndexOffset(),
- EndRequestIndex: p.requestIndexOffset() + p.numChunks(),
- }
-}
-
-func (p *Piece) iterUndirtiedChunks(f func(chunkIndexType)) {
- if true {
- p.undirtiedChunksIter().Iter(f)
- return
- }
- // The original implementation.
- for i := chunkIndexType(0); i < p.numChunks(); i++ {
- if p.chunkIndexDirty(i) {
- continue
- }
- f(i)
- }
-}
-
func (p *Piece) requestIndexOffset() RequestIndex {
return p.t.pieceRequestIndexOffset(p.index)
}
Availability: p.availability,
Length: int64(p.length()),
NumPendingChunks: int(t.pieceNumPendingChunks(i)),
- IterPendingChunks: p.undirtiedChunksIter(),
+ IterPendingChunks: &p.undirtiedChunksIter,
})
}
t.iterPeers(func(p *Peer) {
beginFile := pieceFirstFileIndex(piece.torrentBeginOffset(), files)
endFile := pieceEndFileIndex(piece.torrentEndOffset(), files)
piece.files = files[beginFile:endFile]
+ piece.undirtiedChunksIter = undirtiedChunksIter{
+ TorrentDirtyChunks: &t.dirtyChunks,
+ StartRequestIndex: piece.requestIndexOffset(),
+ EndRequestIndex: piece.requestIndexOffset() + piece.numChunks(),
+ }
}
}