github.com/jmigpin/editor@v1.6.0/util/syncutil/syncedq.go (about) 1 package syncutil 2 3 import ( 4 "container/list" 5 "sync" 6 ) 7 8 type SyncedQ struct { 9 sync.Mutex 10 cond *sync.Cond 11 q list.List 12 } 13 14 func NewSyncedQ() *SyncedQ { 15 sq := &SyncedQ{} 16 sq.cond = sync.NewCond(sq) 17 return sq 18 } 19 20 func (sq *SyncedQ) PushBack(v interface{}) { 21 sq.Lock() 22 sq.q.PushBack(v) 23 sq.Unlock() 24 sq.cond.Signal() 25 } 26 27 // Waits until a value is available 28 func (sq *SyncedQ) PopFront() interface{} { 29 sq.Lock() 30 for sq.q.Len() == 0 { 31 sq.cond.Wait() 32 } 33 defer sq.Unlock() 34 35 e := sq.q.Front() 36 v := e.Value 37 sq.q.Remove(e) 38 return v 39 } 40 41 func (sq *SyncedQ) PeekFront() (interface{}, bool) { 42 sq.Lock() 43 defer sq.Unlock() 44 if sq.q.Len() == 0 { 45 return nil, false 46 } 47 e := sq.q.Front() 48 return e.Value, true 49 }