requesting.go | 11 +++++++---- torrent.go | 2 +- diff --git a/requesting.go b/requesting.go index af609356da0c858f1e91739efbd1727e113b1236..5d79238d094849ab04d44a26e728a300728f1126 100644 --- a/requesting.go +++ b/requesting.go @@ -9,6 +9,8 @@ "runtime/pprof" "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 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 @@ !p.peer.peerAllowedFast.Contains(leftPieceIndex), !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 @@ peer: p, 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 @@ } 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 { diff --git a/torrent.go b/torrent.go index 2ced6bcb95e5232c54fce47ce9a1ec1a7d714ba7..dc586770dcd6b212b70d1b612f2ccc225f764b19 100644 --- a/torrent.go +++ b/torrent.go @@ -172,7 +172,7 @@ smartBanCache smartBanCache // Large allocations reused between request state updates. - requestPieceStates []request_strategy.PieceRequestOrderState + requestPieceStates []g.Option[request_strategy.PieceRequestOrderState] requestIndexes []RequestIndex disableTriggers bool