aboutsummaryrefslogtreecommitdiff
path: root/tcpdialer.go
diff options
context:
space:
mode:
authorGravatar Aliaksandr Valialkin <valyala@gmail.com> 2016-05-16 17:17:18 +0300
committerGravatar Aliaksandr Valialkin <valyala@gmail.com> 2016-05-16 17:17:18 +0300
commitf36b47782ae279a52f9f2adc7857eac32147bf87 (patch)
tree2fbd84ed419bcd1b1938156bfa26e6ee28db76ec /tcpdialer.go
parentIssue #95: Added 'Related projects' chapter into README (diff)
downloadfasthttp-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.go39
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