diff options
Diffstat (limited to 'src/net/dial_gen.go')
-rw-r--r-- | src/net/dial_gen.go | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/src/net/dial_gen.go b/src/net/dial_gen.go new file mode 100644 index 000000000..ada623300 --- /dev/null +++ b/src/net/dial_gen.go @@ -0,0 +1,46 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build windows plan9 + +package net + +import ( + "time" +) + +var testingIssue5349 bool // used during tests + +// dialChannel is the simple pure-Go implementation of dial, still +// used on operating systems where the deadline hasn't been pushed +// down into the pollserver. (Plan 9 and some old versions of Windows) +func dialChannel(net string, ra Addr, dialer func(time.Time) (Conn, error), deadline time.Time) (Conn, error) { + var timeout time.Duration + if !deadline.IsZero() { + timeout = deadline.Sub(time.Now()) + } + if timeout <= 0 { + return dialer(noDeadline) + } + t := time.NewTimer(timeout) + defer t.Stop() + type racer struct { + Conn + error + } + ch := make(chan racer, 1) + go func() { + if testingIssue5349 { + time.Sleep(time.Millisecond) + } + c, err := dialer(noDeadline) + ch <- racer{c, err} + }() + select { + case <-t.C: + return nil, &OpError{Op: "dial", Net: net, Addr: ra, Err: errTimeout} + case racer := <-ch: + return racer.Conn, racer.error + } +} |