torrent-piece-request-order.go 1.7 KB

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