9 "github.com/anacrolix/multiless"
12 type worseConnInput struct {
15 CompletedHandshake time.Time
16 PeerPriority peerPriority
21 func worseConnInputFromPeer(p *Peer) worseConnInput {
22 ret := worseConnInput{
24 LastHelpful: p.lastHelpful(),
25 CompletedHandshake: p.completedHandshake,
26 Pointer: uintptr(unsafe.Pointer(p)),
28 ret.PeerPriority, ret.PeerPriorityErr = p.peerPriority()
32 func worseConn(_l, _r *Peer) bool {
33 return worseConnInputFromPeer(_l).Less(worseConnInputFromPeer(_r))
36 func (l worseConnInput) Less(r worseConnInput) bool {
37 less, ok := multiless.New().Bool(
38 l.Useful, r.Useful).CmpInt64(
39 l.LastHelpful.Sub(r.LastHelpful).Nanoseconds()).CmpInt64(
40 l.CompletedHandshake.Sub(r.CompletedHandshake).Nanoseconds()).LazySameLess(
41 func() (same, less bool) {
42 same = l.PeerPriorityErr != nil || r.PeerPriorityErr != nil || l.PeerPriority == r.PeerPriority
43 less = l.PeerPriority < r.PeerPriority
49 panic(fmt.Sprintf("cannot differentiate %#v and %#v", l, r))
54 type worseConnSlice struct {
58 var _ heap.Interface = &worseConnSlice{}
60 func (me worseConnSlice) Len() int {
64 func (me worseConnSlice) Less(i, j int) bool {
65 return worseConn(&me.conns[i].Peer, &me.conns[j].Peer)
68 func (me *worseConnSlice) Pop() interface{} {
69 i := len(me.conns) - 1
71 me.conns = me.conns[:i]
75 func (me *worseConnSlice) Push(x interface{}) {
76 me.conns = append(me.conns, x.(*PeerConn))
79 func (me worseConnSlice) Swap(i, j int) {
80 me.conns[i], me.conns[j] = me.conns[j], me.conns[i]