"time"
"unsafe"
+ g "github.com/anacrolix/generics"
+
"github.com/RoaringBitmap/roaring"
"github.com/anacrolix/generics/heap"
"github.com/anacrolix/log"
type desiredPeerRequests struct {
requestIndexes []RequestIndex
peer *Peer
- pieceStates []requestStrategy.PieceRequestOrderState
+ pieceStates []g.Option[requestStrategy.PieceRequestOrderState]
}
func (p *desiredPeerRequests) lessByValue(leftRequest, rightRequest RequestIndex) bool {
!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 {
pieceStates: t.requestPieceStates,
requestIndexes: t.requestIndexes,
}
+ clear(requestHeap.pieceStates)
// Caller-provided allocation for roaring bitmap iteration.
var it typedRoaring.Iterator[RequestIndex]
requestStrategy.GetRequestablePieces(
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 {
smartBanCache smartBanCache
// Large allocations reused between request state updates.
- requestPieceStates []request_strategy.PieceRequestOrderState
+ requestPieceStates []g.Option[request_strategy.PieceRequestOrderState]
requestIndexes []RequestIndex
disableTriggers bool