mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2024-12-22 16:17:55 +08:00
46 lines
779 B
Go
46 lines
779 B
Go
|
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.outbound = append(q.outbound, items...)
|
||
|
|
||
|
}
|
||
|
|
||
|
func (q *UnboundedQueue) Consume(fn func([]string)) {
|
||
|
q.outboundLock.Lock()
|
||
|
defer q.outboundLock.Unlock()
|
||
|
|
||
|
if len(q.outbound) == 0 {
|
||
|
q.inboundLock.Lock()
|
||
|
inbountLen := len(q.inbound)
|
||
|
if inbountLen > 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]
|
||
|
}
|
||
|
|
||
|
}
|