queue.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package logic
  2. import (
  3. "container/list"
  4. "sync"
  5. )
  6. type SyncQueue struct {
  7. lock sync.RWMutex
  8. data *list.List
  9. }
  10. func NewQueue() *SyncQueue {
  11. q := new(SyncQueue)
  12. q.data = list.New()
  13. return q
  14. }
  15. func (sel *SyncQueue) GetAll() []interface{} {
  16. sel.lock.RLock()
  17. var valList []interface{}
  18. for e := sel.data.Front(); e != nil; e = e.Next() {
  19. valList = append(valList, e.Value)
  20. }
  21. sel.lock.RUnlock()
  22. return valList
  23. }
  24. func (sel *SyncQueue) PushBack(v interface{}) int {
  25. sel.lock.Lock()
  26. sel.data.PushBack(v)
  27. sel.lock.Unlock()
  28. return sel.data.Len()
  29. }
  30. func (sel *SyncQueue) Pop() interface{} {
  31. sel.lock.Lock()
  32. e := sel.data.Back()
  33. resData := sel.data.Remove(e)
  34. sel.lock.Unlock()
  35. return resData
  36. }
  37. func (sel *SyncQueue) Back() interface{} {
  38. sel.lock.RLock()
  39. e := sel.data.Back()
  40. sel.lock.RUnlock()
  41. if e != nil {
  42. return e
  43. }
  44. return nil
  45. }
  46. func (sel *SyncQueue) Len() int {
  47. sel.lock.RLock()
  48. l := sel.data.Len()
  49. sel.lock.RUnlock()
  50. return l
  51. }
  52. func (sel *SyncQueue) RemoveE(e *list.Element) interface{} {
  53. sel.lock.Lock()
  54. res := sel.data.Remove(e)
  55. sel.lock.Unlock()
  56. return res
  57. }
  58. func (sel *SyncQueue) Remove(v interface{}) interface{} {
  59. sel.lock.Lock()
  60. var rmE *list.Element
  61. var rmV interface{}
  62. for e := sel.data.Front(); e != nil; e = e.Next() {
  63. if e.Value == v {
  64. rmE = e
  65. break
  66. }
  67. }
  68. if rmE != nil {
  69. rmV = sel.data.Remove(rmE)
  70. }
  71. sel.lock.Unlock()
  72. return rmV
  73. }