You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

82 lines
1.6 KiB

  1. package broker
  2. import (
  3. "sync"
  4. )
  5. type TopicPartitionSubscription struct {
  6. sync.Mutex
  7. name string
  8. lastReadTsNs int64
  9. cond *sync.Cond
  10. }
  11. func NewTopicPartitionSubscription(name string) *TopicPartitionSubscription {
  12. t := &TopicPartitionSubscription{
  13. name: name,
  14. }
  15. t.cond = sync.NewCond(t)
  16. return t
  17. }
  18. func (s *TopicPartitionSubscription) Wait() {
  19. s.Mutex.Lock()
  20. s.cond.Wait()
  21. s.Mutex.Unlock()
  22. }
  23. func (s *TopicPartitionSubscription) NotifyOne() {
  24. // notify one waiting goroutine
  25. s.cond.Signal()
  26. }
  27. type TopicPartitionSubscriptions struct {
  28. sync.Mutex
  29. cond *sync.Cond
  30. subscriptions map[string]*TopicPartitionSubscription
  31. subscriptionsLock sync.RWMutex
  32. }
  33. func NewTopicPartitionSubscriptions() *TopicPartitionSubscriptions {
  34. m := &TopicPartitionSubscriptions{
  35. subscriptions: make(map[string]*TopicPartitionSubscription),
  36. }
  37. m.cond = sync.NewCond(m)
  38. return m
  39. }
  40. func (m *TopicPartitionSubscriptions) AddSubscription(subscription string) *TopicPartitionSubscription {
  41. m.subscriptionsLock.Lock()
  42. defer m.subscriptionsLock.Unlock()
  43. if s, found := m.subscriptions[subscription]; found {
  44. return s
  45. }
  46. s := NewTopicPartitionSubscription(subscription)
  47. m.subscriptions[subscription] = s
  48. return s
  49. }
  50. func (m *TopicPartitionSubscriptions) NotifyAll() {
  51. m.subscriptionsLock.RLock()
  52. defer m.subscriptionsLock.RUnlock()
  53. for name, tps := range m.subscriptions {
  54. println("notifying", name)
  55. tps.NotifyOne()
  56. }
  57. }
  58. func (m *TopicPartitionSubscriptions) Wait() {
  59. m.Mutex.Lock()
  60. m.cond.Wait()
  61. for _, tps := range m.subscriptions {
  62. tps.NotifyOne()
  63. }
  64. m.Mutex.Unlock()
  65. }