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 }