Browse Source

buffered input in kcp client

Darien Raymond 7 năm trước cách đây
mục cha
commit
1e0cad50b1
1 tập tin đã thay đổi với 18 bổ sung8 xóa
  1. 18 8
      transport/internet/kcp/dialer.go

+ 18 - 8
transport/internet/kcp/dialer.go

@@ -19,16 +19,26 @@ var (
 )
 
 func fetchInput(ctx context.Context, input io.Reader, reader PacketReader, conn *Connection) {
-	payload := buf.New()
-	defer payload.Release()
-
-	for {
-		err := payload.Reset(buf.ReadFrom(input))
-		if err != nil {
-			payload.Release()
-			return
+	cache := make(chan *buf.Buffer, 1024)
+	go func() {
+		for {
+			payload := buf.New()
+			if err := payload.Reset(buf.ReadFrom(input)); err != nil {
+				payload.Release()
+				close(cache)
+				return
+			}
+			select {
+			case cache <- payload:
+			default:
+				payload.Release()
+			}
 		}
+	}()
+
+	for payload := range cache {
 		segments := reader.Read(payload.Bytes())
+		payload.Release()
 		if len(segments) > 0 {
 			conn.Input(segments)
 		}