1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- package mux
- import (
- "errors"
- "sync"
- "github.com/cnlh/nps/lib/pool"
- )
- type Element *bufNode
- type bufNode struct {
- val []byte //buf value
- l int //length
- }
- func NewBufNode(buf []byte, l int) *bufNode {
- return &bufNode{
- val: buf,
- l: l,
- }
- }
- type Queue interface {
- Push(e Element) //向队列中添加元素
- Pop() Element //移除队列中最前面的元素
- Clear() bool //清空队列
- Size() int //获取队列的元素个数
- IsEmpty() bool //判断队列是否是空
- }
- type sliceEntry struct {
- element []Element
- sync.Mutex
- }
- func NewQueue() *sliceEntry {
- return &sliceEntry{}
- }
- //向队列中添加元素
- func (entry *sliceEntry) Push(e Element) {
- entry.Lock()
- defer entry.Unlock()
- entry.element = append(entry.element, e)
- }
- //移除队列中最前面的额元素
- func (entry *sliceEntry) Pop() (Element, error) {
- if entry.IsEmpty() {
- return nil, errors.New("queue is empty!")
- }
- entry.Lock()
- defer entry.Unlock()
- firstElement := entry.element[0]
- entry.element = entry.element[1:]
- return firstElement, nil
- }
- func (entry *sliceEntry) Clear() bool {
- entry.Lock()
- defer entry.Unlock()
- if entry.IsEmpty() {
- return false
- }
- for i := 0; i < entry.Size(); i++ {
- pool.PutBufPoolCopy(entry.element[i].val)
- entry.element[i] = nil
- }
- entry.element = nil
- return true
- }
- func (entry *sliceEntry) Size() int {
- return len(entry.element)
- }
- func (entry *sliceEntry) IsEmpty() bool {
- if len(entry.element) == 0 {
- return true
- }
- return false
- }
|