8 request_strategy "github.com/anacrolix/torrent/request-strategy"
9 "github.com/anacrolix/torrent/types"
12 func (cl *Client) requester() {
20 case <-cl.closed.LockedChan(cl.locker()):
22 case <-time.After(100 * time.Millisecond):
27 func (cl *Client) doRequests() {
28 ts := make([]*request_strategy.Torrent, 0, len(cl.torrents))
29 for _, t := range cl.torrents {
30 rst := &request_strategy.Torrent{}
32 rst.Capacity = t.storage.Capacity
34 for i := range t.pieces {
36 rst.Pieces = append(rst.Pieces, request_strategy.Piece{
37 Request: !t.ignorePieceForRequests(i),
38 Priority: p.purePriority(),
39 Partial: t.piecePartiallyDownloaded(i),
40 Availability: p.availability,
41 Length: int64(p.length()),
42 NumPendingChunks: int(t.pieceNumPendingChunks(i)),
43 IterPendingChunks: func(f func(types.ChunkSpec)) {
44 p.iterUndirtiedChunks(func(cs ChunkSpec) bool {
51 t.iterPeers(func(p *Peer) {
55 rst.Peers = append(rst.Peers, &request_strategy.Peer{
56 HasPiece: p.peerHasPiece,
57 MaxRequests: p.nominalMaxRequests,
58 HasExistingRequest: func(r request_strategy.Request) bool {
59 _, ok := p.requests[r]
62 Choking: p.peerChoking,
63 PieceAllowedFast: func(i pieceIndex) bool {
64 return p.peerAllowedFast.Contains(i)
66 DownloadRate: p.downloadRate(),
67 Age: time.Since(p.completedHandshake),
68 Id: unsafe.Pointer(p),
73 nextPeerStates := cl.pieceRequestOrder.DoRequests(ts)
74 for p, state := range nextPeerStates {
75 applyPeerNextRequestState(p, state)
79 func applyPeerNextRequestState(_p request_strategy.PeerPointer, rp request_strategy.PeerNextRequestState) {
81 p.setInterested(rp.Interested)
82 for req := range p.requests {
83 if _, ok := rp.Requests[req]; !ok {
87 for req := range rp.Requests {