Use perIPConn pool

This commit is contained in:
Aliaksandr Valialkin
2015-11-10 15:20:13 +02:00
parent 84b9f9e30a
commit 8081e14ca0
2 changed files with 25 additions and 5 deletions
+24
View File
@@ -42,11 +42,35 @@ type perIPConn struct {
ip uint32
perIPConnCounter *perIPConnCounter
v interface{}
}
func acquirePerIPConn(conn net.Conn, ip uint32, counter *perIPConnCounter) *perIPConn {
v := perIPConnPool.Get()
if v == nil {
v = &perIPConn{}
}
c := v.(*perIPConn)
c.Conn = conn
c.ip = ip
c.perIPConnCounter = counter
c.v = v
return c
}
func releasePerIPConn(c *perIPConn) {
c.Conn = nil
c.perIPConnCounter = nil
perIPConnPool.Put(c.v)
}
var perIPConnPool sync.Pool
func (c *perIPConn) Close() error {
err := c.Conn.Close()
c.perIPConnCounter.Unregister(c.ip)
releasePerIPConn(c)
return err
}
+1 -5
View File
@@ -413,11 +413,7 @@ func wrapPerIPConn(s *Server, c net.Conn) net.Conn {
s.perIPConnCounter.Unregister(ip)
return nil
}
return &perIPConn{
Conn: c,
ip: ip,
perIPConnCounter: &s.perIPConnCounter,
}
return acquirePerIPConn(c, ip, &s.perIPConnCounter)
}
var defaultLogger = Logger(log.New(os.Stderr, "", log.LstdFlags))