فهرست منبع

simplify kcp logic

Darien Raymond 9 سال پیش
والد
کامیت
4ee758c4d2
2فایلهای تغییر یافته به همراه49 افزوده شده و 49 حذف شده
  1. 17 15
      transport/internet/kcp/receiving.go
  2. 32 34
      transport/internet/kcp/sending.go

+ 17 - 15
transport/internet/kcp/receiving.go

@@ -80,14 +80,15 @@ func (this *AckList) Add(number uint32, timestamp uint32) {
 func (this *AckList) Clear(una uint32) {
 	count := 0
 	for i := 0; i < len(this.numbers); i++ {
-		if this.numbers[i] >= una {
-			if i != count {
-				this.numbers[count] = this.numbers[i]
-				this.timestamps[count] = this.timestamps[i]
-				this.nextFlush[count] = this.nextFlush[i]
-			}
-			count++
+		if this.numbers[i] < una {
+			continue
 		}
+		if i != count {
+			this.numbers[count] = this.numbers[i]
+			this.timestamps[count] = this.timestamps[i]
+			this.nextFlush[count] = this.nextFlush[i]
+		}
+		count++
 	}
 	if count < len(this.numbers) {
 		this.numbers = this.numbers[:count]
@@ -99,15 +100,16 @@ func (this *AckList) Clear(una uint32) {
 func (this *AckList) Flush(current uint32, rto uint32) {
 	seg := NewAckSegment()
 	for i := 0; i < len(this.numbers) && !seg.IsFull(); i++ {
-		if this.nextFlush[i] <= current {
-			seg.PutNumber(this.numbers[i])
-			seg.PutTimestamp(this.timestamps[i])
-			timeout := rto / 4
-			if timeout < 20 {
-				timeout = 20
-			}
-			this.nextFlush[i] = current + timeout
+		if this.nextFlush[i] > current {
+			continue
+		}
+		seg.PutNumber(this.numbers[i])
+		seg.PutTimestamp(this.timestamps[i])
+		timeout := rto / 4
+		if timeout < 20 {
+			timeout = 20
 		}
+		this.nextFlush[i] = current + timeout
 	}
 	if seg.Count > 0 {
 		this.writer.Write(seg)

+ 32 - 34
transport/internet/kcp/sending.go

@@ -109,21 +109,25 @@ func (this *SendingWindow) Remove(idx uint32) bool {
 }
 
 func (this *SendingWindow) HandleFastAck(number uint32, rto uint32) {
-	if this.len == 0 {
+	if this.IsEmpty() {
 		return
 	}
 
-	for i := this.start; ; i = this.next[i] {
-		seg := &this.data[i]
-		if number-seg.Number > 0x7FFFFFFF {
-			break
+	this.Visit(func(seg *DataSegment) bool {
+		if number == seg.Number || number-seg.Number > 0x7FFFFFFF {
+			return false
 		}
-		if number != seg.Number {
-			if seg.transmit > 0 && seg.timeout > rto/3 {
-				seg.timeout -= rto / 3
-			}
+
+		if seg.transmit > 0 && seg.timeout > rto/3 {
+			seg.timeout -= rto / 3
 		}
-		if i == this.last {
+		return true
+	})
+}
+
+func (this *SendingWindow) Visit(visitor func(seg *DataSegment) bool) {
+	for i := this.start; ; i = this.next[i] {
+		if !visitor(&this.data[i]) || i == this.last {
 			break
 		}
 	}
@@ -137,33 +141,27 @@ func (this *SendingWindow) Flush(current uint32, rto uint32, maxInFlightSize uin
 	var lost uint32
 	var inFlightSize uint32
 
-	for i := this.start; ; i = this.next[i] {
-		segment := &this.data[i]
-		needsend := false
-		if current-segment.timeout < 0x7FFFFFFF {
-			if segment.transmit == 0 {
-				// First time
-				this.totalInFlightSize++
-			} else {
-				lost++
-			}
-			needsend = true
-			segment.timeout = current + rto
+	this.Visit(func(segment *DataSegment) bool {
+		if current-segment.timeout >= 0x7FFFFFFF {
+			return true
 		}
-
-		if needsend {
-			segment.Timestamp = current
-			segment.transmit++
-			this.writer.Write(segment)
-			inFlightSize++
-			if inFlightSize >= maxInFlightSize {
-				break
-			}
+		if segment.transmit == 0 {
+			// First time
+			this.totalInFlightSize++
+		} else {
+			lost++
 		}
-		if i == this.last {
-			break
+		segment.timeout = current + rto
+
+		segment.Timestamp = current
+		segment.transmit++
+		this.writer.Write(segment)
+		inFlightSize++
+		if inFlightSize >= maxInFlightSize {
+			return false
 		}
-	}
+		return true
+	})
 
 	if this.onPacketLoss != nil && inFlightSize > 0 && this.totalInFlightSize != 0 {
 		rate := lost * 100 / this.totalInFlightSize