]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Use Option with request piece states cache
authorMatt Joiner <anacrolix@gmail.com>
Tue, 2 Apr 2024 03:02:48 +0000 (14:02 +1100)
committerMatt Joiner <anacrolix@gmail.com>
Tue, 2 Apr 2024 07:26:12 +0000 (18:26 +1100)
requesting.go
torrent.go

index af609356da0c858f1e91739efbd1727e113b1236..5d79238d094849ab04d44a26e728a300728f1126 100644 (file)
@@ -9,6 +9,8 @@ import (
        "time"
        "unsafe"
 
+       g "github.com/anacrolix/generics"
+
        "github.com/RoaringBitmap/roaring"
        "github.com/anacrolix/generics/heap"
        "github.com/anacrolix/log"
@@ -78,7 +80,7 @@ type (
 type desiredPeerRequests struct {
        requestIndexes []RequestIndex
        peer           *Peer
-       pieceStates    []requestStrategy.PieceRequestOrderState
+       pieceStates    []g.Option[requestStrategy.PieceRequestOrderState]
 }
 
 func (p *desiredPeerRequests) lessByValue(leftRequest, rightRequest RequestIndex) bool {
@@ -95,8 +97,8 @@ func (p *desiredPeerRequests) lessByValue(leftRequest, rightRequest RequestIndex
                        !p.peer.peerAllowedFast.Contains(rightPieceIndex),
                )
        }
-       leftPiece := &p.pieceStates[leftPieceIndex]
-       rightPiece := &p.pieceStates[rightPieceIndex]
+       leftPiece := p.pieceStates[leftPieceIndex].UnwrapPtr()
+       rightPiece := p.pieceStates[rightPieceIndex].UnwrapPtr()
        // Putting this first means we can steal requests from lesser-performing peers for our first few
        // new requests.
        priority := func() PiecePriority {
@@ -183,6 +185,7 @@ func (p *Peer) getDesiredRequestState() (desired desiredRequestState) {
                pieceStates:    t.requestPieceStates,
                requestIndexes: t.requestIndexes,
        }
+       clear(requestHeap.pieceStates)
        // Caller-provided allocation for roaring bitmap iteration.
        var it typedRoaring.Iterator[RequestIndex]
        requestStrategy.GetRequestablePieces(
@@ -195,7 +198,7 @@ func (p *Peer) getDesiredRequestState() (desired desiredRequestState) {
                        if !p.peerHasPiece(pieceIndex) {
                                return
                        }
-                       requestHeap.pieceStates[pieceIndex] = pieceExtra
+                       requestHeap.pieceStates[pieceIndex].Set(pieceExtra)
                        allowedFast := p.peerAllowedFast.Contains(pieceIndex)
                        t.iterUndirtiedRequestIndexesInPiece(&it, pieceIndex, func(r requestStrategy.RequestIndex) {
                                if !allowedFast {
index 2ced6bcb95e5232c54fce47ce9a1ec1a7d714ba7..dc586770dcd6b212b70d1b612f2ccc225f764b19 100644 (file)
@@ -172,7 +172,7 @@ type Torrent struct {
        smartBanCache smartBanCache
 
        // Large allocations reused between request state updates.
-       requestPieceStates []request_strategy.PieceRequestOrderState
+       requestPieceStates []g.Option[request_strategy.PieceRequestOrderState]
        requestIndexes     []RequestIndex
 
        disableTriggers bool