]> Cypherpunks repositories - gostls13.git/commitdiff
net: do not start io if deadline has passed
authorAlex Brainman <alex.brainman@gmail.com>
Sat, 24 Nov 2012 23:02:57 +0000 (10:02 +1100)
committerAlex Brainman <alex.brainman@gmail.com>
Sat, 24 Nov 2012 23:02:57 +0000 (10:02 +1100)
R=golang-dev, mikioh.mikioh, minux.ma, bradfitz
CC=golang-dev
https://golang.org/cl/6851098

src/pkg/net/fd_windows.go

index 5338def92205be12bad90de2b038eb14d132e63d..351f9271c72d22337478e551028546c8f781933e 100644 (file)
@@ -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
        }