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  }