mirror of
https://github.com/duanhf2012/origin.git
synced 2026-02-03 22:45:13 +08:00
61 lines
887 B
Go
61 lines
887 B
Go
package queue
|
|
|
|
import "sync"
|
|
|
|
type SyncQueue struct {
|
|
que *Queue
|
|
mutex sync.RWMutex
|
|
}
|
|
|
|
func (q *SyncQueue) Len() int {
|
|
q.mutex.RLock()
|
|
defer q.mutex.RUnlock()
|
|
|
|
return q.que.Length()
|
|
}
|
|
|
|
func (q *SyncQueue) Add(elem interface{}) {
|
|
q.mutex.Lock()
|
|
defer q.mutex.Unlock()
|
|
|
|
q.que.Add(elem)
|
|
}
|
|
|
|
func (q *SyncQueue) Peek() interface{} {
|
|
q.mutex.RLock()
|
|
defer q.mutex.RUnlock()
|
|
|
|
return q.que.Peek()
|
|
}
|
|
|
|
func (q *SyncQueue) Get(i int) interface{} {
|
|
q.mutex.RLock()
|
|
defer q.mutex.RUnlock()
|
|
|
|
return q.que.Get(i)
|
|
}
|
|
|
|
func (q *SyncQueue) Pop() interface{} {
|
|
|
|
q.mutex.Lock()
|
|
defer q.mutex.Unlock()
|
|
|
|
return q.que.Pop()
|
|
}
|
|
|
|
func (q *SyncQueue) RLockRange(f func(interface{})) {
|
|
q.mutex.RLock()
|
|
defer q.mutex.RUnlock()
|
|
|
|
for i := 0; i < q.que.Length(); i++ {
|
|
f(q.Get(i))
|
|
}
|
|
}
|
|
|
|
func NewSyncQueue() *SyncQueue {
|
|
syncQueue := SyncQueue{}
|
|
syncQueue.que = NewQueue()
|
|
|
|
return &syncQueue
|
|
}
|