]> Sergey Matveev's repositories - btrtrc.git/blob - torrent-piece-request-order.go
cmd/btrtrc client
[btrtrc.git] / torrent-piece-request-order.go
1 package torrent
2
3 import (
4         g "github.com/anacrolix/generics"
5
6         request_strategy "github.com/anacrolix/torrent/request-strategy"
7 )
8
9 func (t *Torrent) updatePieceRequestOrderPiece(pieceIndex int) {
10         if t.storage == nil {
11                 return
12         }
13         pro, ok := t.cl.pieceRequestOrder[t.clientPieceRequestOrderKey()]
14         if !ok {
15                 return
16         }
17         key := t.pieceRequestOrderKey(pieceIndex)
18         if t.hasStorageCap() {
19                 pro.Update(key, t.requestStrategyPieceOrderState(pieceIndex))
20                 return
21         }
22         pending := !t.ignorePieceForRequests(pieceIndex)
23         if pending {
24                 pro.Add(key, t.requestStrategyPieceOrderState(pieceIndex))
25         } else {
26                 pro.Delete(key)
27         }
28 }
29
30 func (t *Torrent) clientPieceRequestOrderKey() interface{} {
31         if t.storage.Capacity == nil {
32                 return t
33         }
34         return t.storage.Capacity
35 }
36
37 func (t *Torrent) deletePieceRequestOrder() {
38         if t.storage == nil {
39                 return
40         }
41         cpro := t.cl.pieceRequestOrder
42         key := t.clientPieceRequestOrderKey()
43         pro := cpro[key]
44         for i := 0; i < t.numPieces(); i++ {
45                 pro.Delete(t.pieceRequestOrderKey(i))
46         }
47         if pro.Len() == 0 {
48                 delete(cpro, key)
49         }
50 }
51
52 func (t *Torrent) initPieceRequestOrder() {
53         if t.storage == nil {
54                 return
55         }
56         g.MakeMapIfNil(&t.cl.pieceRequestOrder)
57         key := t.clientPieceRequestOrderKey()
58         cpro := t.cl.pieceRequestOrder
59         if cpro[key] == nil {
60                 cpro[key] = request_strategy.NewPieceOrder(request_strategy.NewAjwernerBtree(), t.numPieces())
61         }
62 }
63
64 func (t *Torrent) addRequestOrderPiece(i int) {
65         if t.storage == nil {
66                 return
67         }
68         pro := t.getPieceRequestOrder()
69         key := t.pieceRequestOrderKey(i)
70         if t.hasStorageCap() || !t.ignorePieceForRequests(i) {
71                 pro.Add(key, t.requestStrategyPieceOrderState(i))
72         }
73 }
74
75 func (t *Torrent) getPieceRequestOrder() *request_strategy.PieceRequestOrder {
76         return t.cl.pieceRequestOrder[t.clientPieceRequestOrderKey()]
77 }