Explorar o código

flush acklist when dirty

Darien Raymond %!s(int64=9) %!d(string=hai) anos
pai
achega
207c7aa8a7
Modificáronse 1 ficheiros con 9 adicións e 4 borrados
  1. 9 4
      transport/internet/kcp/receiving.go

+ 9 - 4
transport/internet/kcp/receiving.go

@@ -62,14 +62,15 @@ type AckList struct {
 	nextFlush  []uint32
 
 	flushCandidates []uint32
+	dirty           bool
 }
 
 func NewAckList(writer SegmentWriter) *AckList {
 	return &AckList{
 		writer:          writer,
-		timestamps:      make([]uint32, 0, 32),
-		numbers:         make([]uint32, 0, 32),
-		nextFlush:       make([]uint32, 0, 32),
+		timestamps:      make([]uint32, 0, 128),
+		numbers:         make([]uint32, 0, 128),
+		nextFlush:       make([]uint32, 0, 128),
 		flushCandidates: make([]uint32, 0, 128),
 	}
 }
@@ -78,6 +79,7 @@ func (v *AckList) Add(number uint32, timestamp uint32) {
 	v.timestamps = append(v.timestamps, timestamp)
 	v.numbers = append(v.numbers, number)
 	v.nextFlush = append(v.nextFlush, 0)
+	v.dirty = true
 }
 
 func (v *AckList) Clear(una uint32) {
@@ -97,6 +99,7 @@ func (v *AckList) Clear(una uint32) {
 		v.numbers = v.numbers[:count]
 		v.timestamps = v.timestamps[:count]
 		v.nextFlush = v.nextFlush[:count]
+		v.dirty = true
 	}
 }
 
@@ -123,9 +126,10 @@ func (v *AckList) Flush(current uint32, rto uint32) {
 			v.writer.Write(seg)
 			seg.Release()
 			seg = NewAckSegment()
+			v.dirty = false
 		}
 	}
-	if seg.Count > 0 {
+	if v.dirty || seg.Count > 0 {
 		for _, number := range v.flushCandidates {
 			if seg.IsFull() {
 				break
@@ -134,6 +138,7 @@ func (v *AckList) Flush(current uint32, rto uint32) {
 		}
 		v.writer.Write(seg)
 		seg.Release()
+		v.dirty = false
 	}
 }