From: Alex Brainman Date: Sat, 24 Nov 2012 23:02:57 +0000 (+1100) Subject: net: do not start io if deadline has passed X-Git-Tag: go1.1rc2~1812 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=747dda9767d3da479900ad180b11a73f78f0412e;p=gostls13.git net: do not start io if deadline has passed R=golang-dev, mikioh.mikioh, minux.ma, bradfitz CC=golang-dev https://golang.org/cl/6851098 --- diff --git a/src/pkg/net/fd_windows.go b/src/pkg/net/fd_windows.go index 5338def922..351f9271c7 100644 --- a/src/pkg/net/fd_windows.go +++ b/src/pkg/net/fd_windows.go @@ -169,6 +169,15 @@ func (s *ioSrv) ProcessRemoteIO() { func (s *ioSrv) ExecIO(oi anOpIface, deadline int64) (int, error) { var err error o := oi.Op() + // Calculate timeout delta. + var delta int64 + if deadline != 0 { + delta = deadline - time.Now().UnixNano() + if delta <= 0 { + return 0, &OpError{oi.Name(), o.fd.net, o.fd.laddr, errTimeout} + } + } + // Start IO. if canCancelIO { err = oi.Submit() } else { @@ -188,12 +197,8 @@ func (s *ioSrv) ExecIO(oi anOpIface, deadline int64) (int, error) { } // Setup timer, if deadline is given. var timer <-chan time.Time - if deadline != 0 { - dt := deadline - time.Now().UnixNano() - if dt < 1 { - dt = 1 - } - t := time.NewTimer(time.Duration(dt) * time.Nanosecond) + if delta > 0 { + t := time.NewTimer(time.Duration(delta) * time.Nanosecond) defer t.Stop() timer = t.C }