github.com/Cloud-Foundations/Dominator@v0.3.4/lib/srpc/managed.go (about)

     1  package srpc
     2  
     3  import (
     4  	"crypto/tls"
     5  
     6  	"github.com/Cloud-Foundations/Dominator/lib/connpool"
     7  )
     8  
     9  func newClientResource(network, address string) *ClientResource {
    10  	clientResource := &ClientResource{
    11  		network: network,
    12  		address: address,
    13  	}
    14  	clientResource.privateClientResource.clientResource = clientResource
    15  	rp := connpool.GetResourcePool()
    16  	clientResource.resource = rp.Create(&clientResource.privateClientResource)
    17  	return clientResource
    18  }
    19  
    20  func (cr *ClientResource) getHTTP(tlsConfig *tls.Config,
    21  	cancelChannel <-chan struct{}, dialer connpool.Dialer) (*Client, error) {
    22  	cr.privateClientResource.tlsConfig = tlsConfig
    23  	cr.privateClientResource.dialer = dialer
    24  	if err := cr.resource.Get(cancelChannel); err != nil {
    25  		return nil, err
    26  	}
    27  	cr.inUse = true
    28  	clientMetricsMutex.Lock()
    29  	numInUseClientConnections++
    30  	clientMetricsMutex.Unlock()
    31  	return cr.client, nil
    32  }
    33  
    34  func (client *Client) put() {
    35  	client.resource.resource.Put()
    36  	if client.resource.inUse {
    37  		clientMetricsMutex.Lock()
    38  		numInUseClientConnections--
    39  		clientMetricsMutex.Unlock()
    40  		client.resource.inUse = false
    41  	}
    42  }
    43  
    44  func (pcr *privateClientResource) Allocate() error {
    45  	cr := pcr.clientResource
    46  	client, err := dialHTTP(cr.network, cr.address, pcr.tlsConfig, pcr.dialer)
    47  	if err != nil {
    48  		return err
    49  	}
    50  	cr.client = client
    51  	client.resource = cr
    52  	return nil
    53  }
    54  
    55  func (pcr *privateClientResource) Release() error {
    56  	cr := pcr.clientResource
    57  	err := cr.client.conn.Close()
    58  	cr.client = nil
    59  	return err
    60  }