1 package request_strategy
6 "github.com/anacrolix/torrent/metainfo"
7 "github.com/tidwall/btree"
10 func NewPieceOrder() *PieceRequestOrder {
11 return &PieceRequestOrder{
12 tree: btree.NewOptions(
13 func(a, b pieceRequestOrderItem) bool {
16 btree.Options{NoLocks: true}),
17 keys: make(map[PieceRequestOrderKey]PieceRequestOrderState),
21 type PieceRequestOrder struct {
22 tree *btree.BTree[pieceRequestOrderItem]
23 keys map[PieceRequestOrderKey]PieceRequestOrderState
24 PathHint *btree.PathHint
27 type PieceRequestOrderKey struct {
28 InfoHash metainfo.Hash
32 type PieceRequestOrderState struct {
33 Priority piecePriority
38 type pieceRequestOrderItem struct {
39 key PieceRequestOrderKey
40 state PieceRequestOrderState
43 func (me *pieceRequestOrderItem) Less(otherConcrete *pieceRequestOrderItem) bool {
44 return pieceOrderLess(me, otherConcrete).Less()
47 func (me *PieceRequestOrder) Add(key PieceRequestOrderKey, state PieceRequestOrderState) {
48 if _, ok := me.keys[key]; ok {
51 if _, ok := me.tree.SetHint(pieceRequestOrderItem{
55 panic("shouldn't already have this")
60 type PieceRequestOrderPathHint = btree.PathHint
62 func (me *PieceRequestOrder) Update(
63 key PieceRequestOrderKey,
64 state PieceRequestOrderState,
66 oldState, ok := me.keys[key]
68 panic("key should have been added already")
70 if state == oldState {
73 item := pieceRequestOrderItem{
77 if _, ok := me.tree.DeleteHint(item, me.PathHint); !ok {
78 panic(fmt.Sprintf("%#v", key))
81 if _, ok := me.tree.SetHint(item, me.PathHint); ok {
87 func (me *PieceRequestOrder) existingItemForKey(key PieceRequestOrderKey) pieceRequestOrderItem {
88 return pieceRequestOrderItem{
94 func (me *PieceRequestOrder) Delete(key PieceRequestOrderKey) {
95 item := me.existingItemForKey(key)
96 if _, ok := me.tree.DeleteHint(item, me.PathHint); !ok {
102 func (me *PieceRequestOrder) Len() int {