github.com/Cloud-Foundations/Dominator@v0.3.4/lib/connpool/conn.go (about) 1 package connpool 2 3 func newConnResource(network, address string) *ConnResource { 4 connResource := &ConnResource{ 5 network: network, 6 address: address, 7 } 8 connResource.privateConnResource.connResource = connResource 9 rp := GetResourcePool() 10 connResource.resource = rp.Create(&connResource.privateConnResource) 11 return connResource 12 } 13 14 func (cr *ConnResource) get(cancelChannel <-chan struct{}, 15 dialer Dialer) (*Conn, error) { 16 cr.privateConnResource.dialer = dialer 17 if err := cr.resource.Get(cancelChannel); err != nil { 18 return nil, err 19 } 20 cr.conn.Conn = cr.netConn 21 return cr.conn, nil 22 } 23 24 func (conn *Conn) close() error { 25 return conn.resource.resource.Release() 26 } 27 28 func (conn *Conn) put() { 29 conn.Conn = nil 30 conn.resource.resource.Put() 31 } 32 33 func (pcr *privateConnResource) Allocate() error { 34 cr := pcr.connResource 35 netConn, err := pcr.dialer.Dial(cr.network, cr.address) 36 if err != nil { 37 return err 38 } 39 conn := &Conn{resource: cr} 40 cr.conn = conn 41 cr.netConn = netConn 42 return nil 43 } 44 45 func (pcr *privateConnResource) Release() error { 46 cr := pcr.connResource 47 err := cr.conn.Close() 48 cr.conn.Conn = nil 49 cr.conn = nil 50 return err 51 }