From 2dc74faf197a1ded8488a6e20514a4efa4c69ca4 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Mon, 28 Nov 2016 22:06:32 +0100 Subject: [PATCH] send more ack numbers if not full --- transport/internet/kcp/receiving.go | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/transport/internet/kcp/receiving.go b/transport/internet/kcp/receiving.go index 824c7bd2..62ae6d0b 100644 --- a/transport/internet/kcp/receiving.go +++ b/transport/internet/kcp/receiving.go @@ -60,14 +60,17 @@ type AckList struct { timestamps []uint32 numbers []uint32 nextFlush []uint32 + + flushCandidates []uint32 } func NewAckList(writer SegmentWriter) *AckList { return &AckList{ - writer: writer, - timestamps: make([]uint32, 0, 32), - numbers: make([]uint32, 0, 32), - nextFlush: make([]uint32, 0, 32), + writer: writer, + timestamps: make([]uint32, 0, 32), + numbers: make([]uint32, 0, 32), + nextFlush: make([]uint32, 0, 32), + flushCandidates: make([]uint32, 0, 128), } } @@ -98,9 +101,14 @@ func (v *AckList) Clear(una uint32) { } func (v *AckList) Flush(current uint32, rto uint32) { + v.flushCandidates = v.flushCandidates[:0] + seg := NewAckSegment() for i := 0; i < len(v.numbers) && !seg.IsFull(); i++ { if v.nextFlush[i] > current { + if len(v.flushCandidates) < cap(v.flushCandidates) { + v.flushCandidates = append(v.flushCandidates, v.numbers[i]) + } continue } seg.PutNumber(v.numbers[i]) @@ -112,6 +120,12 @@ func (v *AckList) Flush(current uint32, rto uint32) { v.nextFlush[i] = current + timeout } if seg.Count > 0 { + for _, number := range v.flushCandidates { + if seg.IsFull() { + break + } + seg.PutNumber(number) + } v.writer.Write(seg) seg.Release() }