72 lines
998 B
Go
72 lines
998 B
Go
package netlib
|
|
|
|
import "sync"
|
|
|
|
var pp = NewPacketPool(10240)
|
|
|
|
func AllocPacket() *packet {
|
|
return pp.Get()
|
|
}
|
|
|
|
func FreePacket(p *packet) {
|
|
pp.Give(p)
|
|
}
|
|
|
|
type PacketPool struct {
|
|
free *packet
|
|
lock *sync.Mutex
|
|
num int
|
|
allocNum int
|
|
remainNum int
|
|
}
|
|
|
|
func NewPacketPool(num int) *PacketPool {
|
|
pp := &PacketPool{
|
|
lock: new(sync.Mutex),
|
|
num: num,
|
|
}
|
|
return pp
|
|
}
|
|
|
|
func (pp *PacketPool) grow() {
|
|
var (
|
|
i int
|
|
p *packet
|
|
ps = make([]packet, pp.num)
|
|
)
|
|
pp.free = &(ps[0])
|
|
p = pp.free
|
|
for i = 1; i < pp.num; i++ {
|
|
p.next = &(ps[i])
|
|
p = p.next
|
|
}
|
|
p.next = nil
|
|
pp.allocNum += pp.num
|
|
pp.remainNum += pp.num
|
|
return
|
|
}
|
|
|
|
func (pp *PacketPool) Get() (p *packet) {
|
|
pp.lock.Lock()
|
|
if p = pp.free; p == nil {
|
|
pp.grow()
|
|
p = pp.free
|
|
}
|
|
pp.free = p.next
|
|
p.next = nil
|
|
pp.remainNum--
|
|
pp.lock.Unlock()
|
|
return
|
|
}
|
|
|
|
func (pp *PacketPool) Give(p *packet) {
|
|
if p.next != nil {
|
|
return
|
|
}
|
|
pp.lock.Lock()
|
|
p.next = pp.free
|
|
pp.free = p
|
|
pp.remainNum++
|
|
pp.lock.Unlock()
|
|
}
|