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  }