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