|
|
@ -3,6 +3,7 @@ package kcp |
|
|
|
import ( |
|
|
|
import ( |
|
|
|
"io" |
|
|
|
"io" |
|
|
|
"net" |
|
|
|
"net" |
|
|
|
|
|
|
|
"runtime" |
|
|
|
"sync" |
|
|
|
"sync" |
|
|
|
"sync/atomic" |
|
|
|
"sync/atomic" |
|
|
|
"time" |
|
|
|
"time" |
|
|
@ -280,7 +281,7 @@ func (c *Connection) waitForDataInput() error { |
|
|
|
return io.EOF |
|
|
|
return io.EOF |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
duration := time.Minute |
|
|
|
duration := time.Second * 8 |
|
|
|
if !c.rd.IsZero() { |
|
|
|
if !c.rd.IsZero() { |
|
|
|
duration = time.Until(c.rd) |
|
|
|
duration = time.Until(c.rd) |
|
|
|
if duration < 0 { |
|
|
|
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 { |
|
|
|
select { |
|
|
|
case <-c.dataInput.Wait(): |
|
|
|
case <-c.dataInput.Wait(): |
|
|
|
case <-time.After(duration): |
|
|
|
case <-timeout.C: |
|
|
|
if !c.rd.IsZero() && c.rd.Before(time.Now()) { |
|
|
|
if !c.rd.IsZero() && c.rd.Before(time.Now()) { |
|
|
|
return ErrIOTimeout |
|
|
|
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 { |
|
|
|
select { |
|
|
|
case <-c.dataOutput.Wait(): |
|
|
|
case <-c.dataOutput.Wait(): |
|
|
|
case <-time.After(duration): |
|
|
|
case <-timeout.C: |
|
|
|
if !c.wd.IsZero() && c.wd.Before(time.Now()) { |
|
|
|
if !c.wd.IsZero() && c.wd.Before(time.Now()) { |
|
|
|
return ErrIOTimeout |
|
|
|
return ErrIOTimeout |
|
|
|
} |
|
|
|
} |
|
|
|