mirror of
https://github.com/PeernetOfficial/core.git
synced 2026-07-23 05:07:51 +01:00
58 lines
1.1 KiB
Go
58 lines
1.1 KiB
Go
package udt
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/PeernetOfficial/core/udt/packet"
|
|
)
|
|
|
|
type ackHistoryEntry struct {
|
|
ackID uint32
|
|
lastPacket packet.PacketID
|
|
sendTime time.Time
|
|
}
|
|
|
|
// receiveLossList defines a list of ACK records sorted by their ACK id
|
|
type ackHistoryHeap []*ackHistoryEntry
|
|
|
|
func (h ackHistoryHeap) Len() int {
|
|
return len(h)
|
|
}
|
|
|
|
func (h ackHistoryHeap) Less(i, j int) bool {
|
|
return h[i].ackID < h[j].ackID
|
|
}
|
|
|
|
func (h ackHistoryHeap) Swap(i, j int) {
|
|
h[i], h[j] = h[j], h[i]
|
|
}
|
|
|
|
func (h *ackHistoryHeap) Push(x interface{}) { // Push and Pop use pointer receivers because they modify the slice's length, not just its contents.
|
|
*h = append(*h, x.(*ackHistoryEntry))
|
|
}
|
|
|
|
func (h *ackHistoryHeap) Pop() interface{} {
|
|
old := *h
|
|
n := len(old)
|
|
x := old[n-1]
|
|
*h = old[0 : n-1]
|
|
return x
|
|
}
|
|
|
|
// Find does a binary search of the heap for the specified ackID which is returned
|
|
func (h ackHistoryHeap) Find(ackID uint32) (*ackHistoryEntry, int) {
|
|
len := len(h)
|
|
idx := 0
|
|
for idx < len {
|
|
here := h[idx].ackID
|
|
if here == ackID {
|
|
return h[idx], idx
|
|
} else if here > ackID {
|
|
idx = idx * 2
|
|
} else {
|
|
idx = idx*2 + 1
|
|
}
|
|
}
|
|
return nil, -1
|
|
}
|