diff --git a/peripconn.go b/peripconn.go index cf8e986..2ebe0d4 100644 --- a/peripconn.go +++ b/peripconn.go @@ -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 } diff --git a/server.go b/server.go index 0fc6c4d..2d7de4d 100644 --- a/server.go +++ b/server.go @@ -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))