wait.go 508 B

12345678910111213141516171819202122232425262728293031323334
  1. package wait
  2. import "sync"
  3. type Waiter struct {
  4. l sync.Mutex
  5. m map[int64]chan interface{}
  6. }
  7. func New() Waiter {
  8. return Waiter{m: make(map[int64]chan interface{})}
  9. }
  10. func (w Waiter) Register(id int64) <-chan interface{} {
  11. w.l.Lock()
  12. defer w.l.Unlock()
  13. ch := w.m[id]
  14. if ch == nil {
  15. ch = make(chan interface{}, 1)
  16. w.m[id] = ch
  17. }
  18. return ch
  19. }
  20. func (w Waiter) Trigger(id int64, x interface{}) {
  21. w.l.Lock()
  22. ch := w.m[id]
  23. delete(w.m, id)
  24. w.l.Unlock()
  25. if ch != nil {
  26. ch <- x
  27. close(ch)
  28. }
  29. }