blob: 93162a7cc6196572f544d3dc95fc187c7a8cccfc [file] [log] [blame]
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
}
}
}