From b238188770b93c5e3c11f62923647bd2ac844830 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Thu, 9 Aug 2018 12:23:08 +0200 Subject: [PATCH] delayed timer creation --- transport/internet/kcp/connection.go | 31 +++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/transport/internet/kcp/connection.go b/transport/internet/kcp/connection.go index 4b7d92dc2..64316170f 100644 --- a/transport/internet/kcp/connection.go +++ b/transport/internet/kcp/connection.go @@ -3,6 +3,7 @@ package kcp import ( "io" "net" + "runtime" "sync" "sync/atomic" "time" @@ -280,7 +281,7 @@ func (c *Connection) waitForDataInput() error { return io.EOF } - duration := time.Minute + duration := time.Second * 8 if !c.rd.IsZero() { duration = time.Until(c.rd) if duration < 0 { @@ -288,9 +289,21 @@ func (c *Connection) waitForDataInput() error { } } + for i := 0; i < 16; i++ { + select { + case <-c.dataInput.Wait(): + return nil + default: + runtime.Gosched() + } + } + + timeout := time.NewTimer(duration) + defer timeout.Stop() + select { case <-c.dataInput.Wait(): - case <-time.After(duration): + case <-timeout.C: if !c.rd.IsZero() && c.rd.Before(time.Now()) { return ErrIOTimeout } @@ -330,9 +343,21 @@ func (c *Connection) waitForDataOutput() error { } } + for i := 0; i < 16; i++ { + select { + case <-c.dataInput.Wait(): + return nil + default: + runtime.Gosched() + } + } + + timeout := time.NewTimer(duration) + defer timeout.Stop() + select { case <-c.dataOutput.Wait(): - case <-time.After(duration): + case <-timeout.C: if !c.wd.IsZero() && c.wd.Before(time.Now()) { return ErrIOTimeout }