You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
45 lines
777 B
45 lines
777 B
package util
|
|
|
|
import "sync"
|
|
|
|
type UnboundedQueue struct {
|
|
outbound []string
|
|
outboundLock sync.RWMutex
|
|
inbound []string
|
|
inboundLock sync.RWMutex
|
|
}
|
|
|
|
func NewUnboundedQueue() *UnboundedQueue {
|
|
q := &UnboundedQueue{}
|
|
return q
|
|
}
|
|
|
|
func (q *UnboundedQueue) EnQueue(items ...string) {
|
|
q.inboundLock.Lock()
|
|
defer q.inboundLock.Unlock()
|
|
|
|
q.inbound = append(q.inbound, items...)
|
|
|
|
}
|
|
|
|
func (q *UnboundedQueue) Consume(fn func([]string)) {
|
|
q.outboundLock.Lock()
|
|
defer q.outboundLock.Unlock()
|
|
|
|
if len(q.outbound) == 0 {
|
|
q.inboundLock.Lock()
|
|
inboundLen := len(q.inbound)
|
|
if inboundLen > 0 {
|
|
t := q.outbound
|
|
q.outbound = q.inbound
|
|
q.inbound = t
|
|
}
|
|
q.inboundLock.Unlock()
|
|
}
|
|
|
|
if len(q.outbound) > 0 {
|
|
fn(q.outbound)
|
|
q.outbound = q.outbound[:0]
|
|
}
|
|
|
|
}
|