1 package request_strategy
6 "github.com/anacrolix/torrent/metainfo"
7 "github.com/google/btree"
10 func NewPieceOrder() *PieceRequestOrder {
11 return &PieceRequestOrder{
13 keys: make(map[PieceRequestOrderKey]PieceRequestOrderState),
17 type PieceRequestOrder struct {
19 keys map[PieceRequestOrderKey]PieceRequestOrderState
22 type PieceRequestOrderKey struct {
23 InfoHash metainfo.Hash
27 type PieceRequestOrderState struct {
28 Priority piecePriority
33 type pieceRequestOrderItem struct {
34 key PieceRequestOrderKey
35 state PieceRequestOrderState
38 func (me *pieceRequestOrderItem) Less(other btree.Item) bool {
39 otherConcrete := other.(*pieceRequestOrderItem)
40 return pieceOrderLess(
42 PieceRequestOrderState: me.state,
43 PieceRequestOrderKey: me.key,
46 PieceRequestOrderState: otherConcrete.state,
47 PieceRequestOrderKey: otherConcrete.key,
52 func (me *PieceRequestOrder) Add(key PieceRequestOrderKey, state PieceRequestOrderState) {
53 if _, ok := me.keys[key]; ok {
56 if me.tree.ReplaceOrInsert(&pieceRequestOrderItem{
60 panic("shouldn't already have this")
65 func (me *PieceRequestOrder) Update(key PieceRequestOrderKey, state PieceRequestOrderState) {
66 item := me.existingItemForKey(key)
67 if item.state == state {
70 if me.tree.Delete(&item) == nil {
71 panic(fmt.Sprintf("%#v", key))
74 if me.tree.ReplaceOrInsert(&item) != nil {
80 func (me *PieceRequestOrder) existingItemForKey(key PieceRequestOrderKey) pieceRequestOrderItem {
81 return pieceRequestOrderItem{
87 func (me *PieceRequestOrder) Delete(key PieceRequestOrderKey) {
88 item := me.existingItemForKey(key)
89 if me.tree.Delete(&item) == nil {
93 // log.Printf("deleting %#v", key)