diff options
author | Aliaksandr Valialkin <valyala@gmail.com> | 2016-05-16 17:17:18 +0300 |
---|---|---|
committer | Aliaksandr Valialkin <valyala@gmail.com> | 2016-05-16 17:17:18 +0300 |
commit | f36b47782ae279a52f9f2adc7857eac32147bf87 (patch) | |
tree | 2fbd84ed419bcd1b1938156bfa26e6ee28db76ec /tcpdialer.go | |
parent | Issue #95: Added 'Related projects' chapter into README (diff) | |
download | fasthttp-f36b47782ae279a52f9f2adc7857eac32147bf87.tar.gz fasthttp-f36b47782ae279a52f9f2adc7857eac32147bf87.tar.bz2 fasthttp-f36b47782ae279a52f9f2adc7857eac32147bf87.zip |
removed memory allocations from tryDial. This should improve performance for non-keepalive connections
Diffstat (limited to 'tcpdialer.go')
-rw-r--r-- | tcpdialer.go | 39 |
1 files changed, 33 insertions, 6 deletions
diff --git a/tcpdialer.go b/tcpdialer.go index b074d00..ffb37a8 100644 --- a/tcpdialer.go +++ b/tcpdialer.go @@ -205,8 +205,18 @@ func tryDial(network string, addr *net.TCPAddr, deadline time.Time, concurrencyC select { case concurrencyCh <- struct{}{}: - case <-time.After(timeout): - return nil, ErrDialTimeout + default: + tc := acquireTimer(timeout) + isTimeout := false + select { + case concurrencyCh <- struct{}{}: + case <-tc.C: + isTimeout = true + } + releaseTimer(tc) + if isTimeout { + return nil, ErrDialTimeout + } } timeout = -time.Since(deadline) @@ -215,7 +225,11 @@ func tryDial(network string, addr *net.TCPAddr, deadline time.Time, concurrencyC return nil, ErrDialTimeout } - ch := make(chan dialResult, 1) + chv := dialResultChanPool.Get() + if chv == nil { + chv = make(chan dialResult, 1) + } + ch := chv.(chan dialResult) go func() { var dr dialResult dr.conn, dr.err = net.DialTCP(network, nil, addr) @@ -223,14 +237,27 @@ func tryDial(network string, addr *net.TCPAddr, deadline time.Time, concurrencyC <-concurrencyCh }() + var ( + conn net.Conn + err error + ) + + tc := acquireTimer(timeout) select { case dr := <-ch: - return dr.conn, dr.err - case <-time.After(timeout): - return nil, ErrDialTimeout + conn = dr.conn + err = dr.err + dialResultChanPool.Put(ch) + case <-tc.C: + err = ErrDialTimeout } + releaseTimer(tc) + + return conn, err } +var dialResultChanPool sync.Pool + type dialResult struct { conn net.Conn err error |