Fix listener broadcasting implementation

This commit is contained in:
Fabian Reinartz 2015-10-04 22:58:33 +02:00
parent 856d5091c1
commit 7271ea0907

View File

@ -56,12 +56,14 @@ type MemAlerts struct {
data *MemData data *MemData
mtx sync.RWMutex mtx sync.RWMutex
listeners []chan *types.Alert listeners map[int]chan *types.Alert
next int
} }
func NewMemAlerts(data *MemData) *MemAlerts { func NewMemAlerts(data *MemData) *MemAlerts {
return &MemAlerts{ return &MemAlerts{
data: data, data: data,
listeners: map[int]chan *types.Alert{},
} }
} }
@ -77,13 +79,15 @@ func (a *MemAlerts) Subscribe() AlertIterator {
done = make(chan struct{}) done = make(chan struct{})
) )
i := len(a.listeners) i := a.next
a.listeners = append(a.listeners, ch) a.next++
a.listeners[i] = ch
go func() { go func() {
defer func() { defer func() {
a.mtx.Lock() a.mtx.Lock()
a.listeners = append(a.listeners[:i], a.listeners[i+1:]...) delete(a.listeners, i)
close(ch) close(ch)
a.mtx.Unlock() a.mtx.Unlock()
}() }()