| // 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" |
| |
| // 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) { |
| if deadline.IsZero() { |
| return dialer(noDeadline) |
| } |
| timeout := deadline.Sub(time.Now()) |
| if timeout <= 0 { |
| return nil, &OpError{Op: "dial", Net: net, Source: nil, Addr: ra, Err: errTimeout} |
| } |
| t := time.NewTimer(timeout) |
| defer t.Stop() |
| type racer struct { |
| Conn |
| error |
| } |
| ch := make(chan racer, 1) |
| go func() { |
| testHookDialChannel() |
| c, err := dialer(noDeadline) |
| ch <- racer{c, err} |
| }() |
| select { |
| case <-t.C: |
| return nil, &OpError{Op: "dial", Net: net, Source: nil, Addr: ra, Err: errTimeout} |
| case racer := <-ch: |
| return racer.Conn, racer.error |
| } |
| } |