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.
56 lines
1.2 KiB
56 lines
1.2 KiB
package topic
|
|
|
|
import "sync"
|
|
|
|
type LocalPartitionSubscribers struct {
|
|
Subscribers map[string]*LocalSubscriber
|
|
SubscribersLock sync.RWMutex
|
|
}
|
|
type LocalSubscriber struct {
|
|
stopCh chan struct{}
|
|
}
|
|
|
|
func NewLocalSubscriber() *LocalSubscriber {
|
|
return &LocalSubscriber{
|
|
stopCh: make(chan struct{}, 1),
|
|
}
|
|
}
|
|
func (p *LocalSubscriber) SignalShutdown() {
|
|
close(p.stopCh)
|
|
}
|
|
|
|
func NewLocalPartitionSubscribers() *LocalPartitionSubscribers {
|
|
return &LocalPartitionSubscribers{
|
|
Subscribers: make(map[string]*LocalSubscriber),
|
|
}
|
|
}
|
|
|
|
func (p *LocalPartitionSubscribers) AddSubscriber(clientName string, Subscriber *LocalSubscriber) {
|
|
p.SubscribersLock.Lock()
|
|
defer p.SubscribersLock.Unlock()
|
|
|
|
p.Subscribers[clientName] = Subscriber
|
|
}
|
|
|
|
func (p *LocalPartitionSubscribers) RemoveSubscriber(clientName string) {
|
|
p.SubscribersLock.Lock()
|
|
defer p.SubscribersLock.Unlock()
|
|
|
|
delete(p.Subscribers, clientName)
|
|
}
|
|
|
|
func (p *LocalPartitionSubscribers) SignalShutdown() {
|
|
p.SubscribersLock.RLock()
|
|
defer p.SubscribersLock.RUnlock()
|
|
|
|
for _, Subscriber := range p.Subscribers {
|
|
Subscriber.SignalShutdown()
|
|
}
|
|
}
|
|
|
|
func (p *LocalPartitionSubscribers) IsEmpty() bool {
|
|
p.SubscribersLock.RLock()
|
|
defer p.SubscribersLock.RUnlock()
|
|
|
|
return len(p.Subscribers) == 0
|
|
}
|