github.com/onflow/flow-go@v0.35.7-crescendo-preview.23-atree-inlining/utils/concurrentqueue/concurrentqueue.go (about) 1 package concurrentqueue 2 3 import ( 4 "sync" 5 6 "github.com/ef-ds/deque" 7 ) 8 9 // ConcurrentQueue implements a thread safe interface for unbounded FIFO queue. 10 type ConcurrentQueue struct { 11 q deque.Deque 12 m sync.Mutex 13 } 14 15 func (s *ConcurrentQueue) Len() int { 16 s.m.Lock() 17 defer s.m.Unlock() 18 19 return s.q.Len() 20 } 21 22 func (s *ConcurrentQueue) Push(v interface{}) { 23 s.m.Lock() 24 defer s.m.Unlock() 25 26 s.q.PushBack(v) 27 } 28 29 func (s *ConcurrentQueue) Pop() (interface{}, bool) { 30 s.m.Lock() 31 defer s.m.Unlock() 32 33 return s.q.PopFront() 34 } 35 36 func (s *ConcurrentQueue) PopBatch(batchSize int) ([]interface{}, bool) { 37 s.m.Lock() 38 defer s.m.Unlock() 39 40 count := s.q.Len() 41 if count == 0 { 42 return nil, false 43 } 44 45 if count > batchSize { 46 count = batchSize 47 } 48 49 result := make([]interface{}, count) 50 for i := 0; i < count; i++ { 51 v, _ := s.q.PopFront() 52 result[i] = v 53 } 54 55 return result, true 56 } 57 58 func (s *ConcurrentQueue) Front() (interface{}, bool) { 59 s.m.Lock() 60 defer s.m.Unlock() 61 62 return s.q.Front() 63 }