mirror of
https://github.com/PeernetOfficial/core.git
synced 2026-07-16 18:37:51 +01:00
69 lines
1.3 KiB
Go
69 lines
1.3 KiB
Go
package udt
|
|
|
|
import (
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/PeernetOfficial/core/udt/packet"
|
|
)
|
|
|
|
type ackHistoryEntry struct {
|
|
ackID uint32
|
|
lastPacket packet.PacketID
|
|
sendTime time.Time
|
|
}
|
|
|
|
// receiveLossList defines a list of recvLossEntry records
|
|
type ackHistoryHeap struct {
|
|
// list contains all entries
|
|
list []ackHistoryEntry
|
|
|
|
sync.RWMutex
|
|
}
|
|
|
|
func createHistoryHeap() (heap *ackHistoryHeap) {
|
|
return &ackHistoryHeap{}
|
|
}
|
|
|
|
// Add adds an entry to the list. Deduplication is not performed.
|
|
func (heap *ackHistoryHeap) Add(newEntry ackHistoryEntry) {
|
|
heap.Lock()
|
|
defer heap.Unlock()
|
|
|
|
heap.list = append(heap.list, newEntry)
|
|
}
|
|
|
|
// Remove removes all IDs matching from the list.
|
|
func (heap *ackHistoryHeap) Remove(sequence uint32) (found *ackHistoryEntry) {
|
|
heap.Lock()
|
|
defer heap.Unlock()
|
|
|
|
for n := range heap.list {
|
|
if heap.list[n].ackID == sequence {
|
|
found = &heap.list[n]
|
|
}
|
|
}
|
|
|
|
if found == nil {
|
|
return nil
|
|
}
|
|
|
|
// if found, automatically remove all entries with a lower lastPacket
|
|
var newList []ackHistoryEntry
|
|
|
|
for n := range heap.list {
|
|
if heap.list[n].ackID != sequence && heap.list[n].lastPacket.IsBigger(found.lastPacket) {
|
|
newList = append(newList, heap.list[n])
|
|
}
|
|
}
|
|
|
|
heap.list = newList
|
|
|
|
return found
|
|
}
|
|
|
|
// Count returns the number of packets stored
|
|
func (heap *ackHistoryHeap) Count() (count int) {
|
|
return len(heap.list)
|
|
}
|