Browse Source

delayed timer creation

pull/1524/head^2
Darien Raymond 6 years ago
parent
commit
b238188770
No known key found for this signature in database
GPG Key ID: 7251FFA14BB18169
  1. 31
      transport/internet/kcp/connection.go

31
transport/internet/kcp/connection.go

@ -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
} }

Loading…
Cancel
Save