]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Avoid allocation putting undirtiedChunksIter into interface
authorMatt Joiner <anacrolix@gmail.com>
Wed, 13 Oct 2021 04:17:48 +0000 (15:17 +1100)
committerMatt Joiner <anacrolix@gmail.com>
Tue, 19 Oct 2021 03:08:56 +0000 (14:08 +1100)
issue97_test.go
piece.go
requesting.go
torrent.go

index 2091b758df633dd373665c8088456c715090a810..04a2c4be4d5cc0e4703240fd87846016dd389309 100644 (file)
@@ -19,6 +19,7 @@ func TestHashPieceAfterStorageClosed(t *testing.T) {
        tt := &Torrent{
                storageOpener: storage.NewClient(storage.NewFile(td)),
                logger:        log.Default,
+               chunkSize:     defaultChunkSize,
        }
        mi := testutil.GreetingMetaInfo()
        info, err := mi.UnmarshalInfo()
index 411b187c61c4026a70d1d377af296f43317ab95b..6b70a5b56407c4b6dc287f5d819d98599a47c4cc 100644 (file)
--- a/piece.go
+++ b/piece.go
@@ -8,7 +8,6 @@ import (
        "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"
@@ -41,6 +40,8 @@ type Piece struct {
        // 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 {
@@ -244,13 +245,14 @@ func init() {
        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
@@ -272,29 +274,6 @@ func (me undirtiedChunksIter) Iter(f func(chunkIndexType)) {
        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)
 }
index 0ec4151b0c3e414fc1ab6bce3762eeb8d5f70745..ed20ba80dda80b30fd8aa2d1d5b583a0b9b48ef3 100644 (file)
@@ -46,7 +46,7 @@ func (cl *Client) getRequestStrategyInput() request_strategy.Input {
                                Availability:      p.availability,
                                Length:            int64(p.length()),
                                NumPendingChunks:  int(t.pieceNumPendingChunks(i)),
-                               IterPendingChunks: p.undirtiedChunksIter(),
+                               IterPendingChunks: &p.undirtiedChunksIter,
                        })
                }
                t.iterPeers(func(p *Peer) {
index b4898364376d3667e43c47e4159f8a9fad2f3a5c..e929582479f76b05343447365a77db44fdbb023b 100644 (file)
@@ -363,6 +363,11 @@ func (t *Torrent) makePieces() {
                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(),
+               }
        }
 }