From 19a0d21cb6cc51b52e26fbd458ac1ab3debda5e5 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Tue, 5 Dec 2017 18:04:34 +0100 Subject: [PATCH] fix kcp write --- transport/internet/kcp/connection.go | 5 ++++- transport/internet/kcp/sending.go | 12 ++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/transport/internet/kcp/connection.go b/transport/internet/kcp/connection.go index da99e17ac..25fec1979 100644 --- a/transport/internet/kcp/connection.go +++ b/transport/internet/kcp/connection.go @@ -335,7 +335,7 @@ func (v *Connection) Read(b []byte) (int, error) { } } -// Write implements the Conn Write method. +// Write implements io.Writer. func (v *Connection) Write(b []byte) (int, error) { totalWritten := 0 @@ -352,6 +352,7 @@ func (v *Connection) Write(b []byte) (int, error) { common.Must(rb.Reset(func(bb []byte) (int, error) { return copy(bb[:v.mss], b[totalWritten:]), nil })) + v.dataUpdater.WakeUp() totalWritten += rb.Len() if totalWritten == len(b) { return totalWritten, nil @@ -376,6 +377,7 @@ func (v *Connection) Write(b []byte) (int, error) { } } +// WriteMultiBuffer implements buf.Writer. func (v *Connection) WriteMultiBuffer(mb buf.MultiBuffer) error { defer mb.Release() @@ -392,6 +394,7 @@ func (v *Connection) WriteMultiBuffer(mb buf.MultiBuffer) error { common.Must(rb.Reset(func(bb []byte) (int, error) { return mb.Read(bb[:v.mss]) })) + v.dataUpdater.WakeUp() if mb.IsEmpty() { return nil } diff --git a/transport/internet/kcp/sending.go b/transport/internet/kcp/sending.go index 608afb50c..8e51fe34a 100644 --- a/transport/internet/kcp/sending.go +++ b/transport/internet/kcp/sending.go @@ -288,15 +288,15 @@ func (v *SendingWorker) Push() *buf.Buffer { v.Lock() defer v.Unlock() - if !v.window.IsFull() { - b := v.window.Push(v.nextNumber) - v.nextNumber++ - return b + if v.window.IsFull() { + return nil } - return nil + + b := v.window.Push(v.nextNumber) + v.nextNumber++ + return b } -// Private: Visible for testing. func (v *SendingWorker) Write(seg Segment) error { dataSeg := seg.(*DataSegment)