goserver_sync/core/netlib/packetpool.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()
}