package hci import ( "bytes" "sync" ) // Pool ... type Pool struct { sync.Mutex sz int cnt int ch chan *bytes.Buffer } // NewPool ... func NewPool(sz int, cnt int) *Pool { ch := make(chan *bytes.Buffer, cnt) for len(ch) < cnt { ch <- bytes.NewBuffer(make([]byte, sz)) } return &Pool{sz: sz, cnt: cnt, ch: ch} } // Client ... type Client struct { p *Pool sent chan *bytes.Buffer } // NewClient ... func NewClient(p *Pool) *Client { return &Client{p: p, sent: make(chan *bytes.Buffer, p.cnt)} } // LockPool ... func (c *Client) LockPool() { c.p.Lock() } // UnlockPool ... func (c *Client) UnlockPool() { c.p.Unlock() } // Get returns a buffer from the shared buffer pool. func (c *Client) Get() *bytes.Buffer { b := <-c.p.ch b.Reset() c.sent <- b return b } // Put puts the oldest sent buffer back to the shared pool. func (c *Client) Put() { select { case b := <-c.sent: c.p.ch <- b default: } } // PutAll puts all the sent buffers back to the shared pool. func (c *Client) PutAll() { for { select { case b := <-c.sent: c.p.ch <- b default: return } } }