Kaynağa Gözat

buffered input in kcp client

Darien Raymond 7 yıl önce
ebeveyn
işleme
1e0cad50b1
1 değiştirilmiş dosya ile 18 ekleme ve 8 silme
  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)
 		}