@@ -27,28 +27,22 @@ import (
2727// DiscoveryManager is required to handle multiple pluggable-discovery that
2828// may be shared across platforms
2929type DiscoveryManager struct {
30- discoveries map [string ]* discovery.PluggableDiscovery
31- globalEventCh chan * discovery.Event
30+ discoveries map [string ]* discovery.PluggableDiscovery
3231}
3332
3433var tr = i18n .Tr
3534
3635// New creates a new DiscoveryManager
3736func New () * DiscoveryManager {
3837 return & DiscoveryManager {
39- discoveries : map [string ]* discovery.PluggableDiscovery {},
40- globalEventCh : nil ,
38+ discoveries : map [string ]* discovery.PluggableDiscovery {},
4139 }
4240}
4341
4442// Clear resets the DiscoveryManager to its initial state
4543func (dm * DiscoveryManager ) Clear () {
4644 dm .QuitAll ()
4745 dm .discoveries = map [string ]* discovery.PluggableDiscovery {}
48- if dm .globalEventCh != nil {
49- close (dm .globalEventCh )
50- dm .globalEventCh = nil
51- }
5246}
5347
5448// IDs returns the list of discoveries' ids in this DiscoveryManager
@@ -134,10 +128,10 @@ func (dm *DiscoveryManager) StartAll() []error {
134128// StartSyncAll the discoveries for this DiscoveryManager,
135129// returns an error for each discovery failing to start syncing
136130func (dm * DiscoveryManager ) StartSyncAll () (<- chan * discovery.Event , []error ) {
137- if dm .globalEventCh == nil {
138- dm .globalEventCh = make (chan * discovery.Event , 5 )
139- }
131+ eventSink := make (chan * discovery.Event , 5 )
132+ var wg sync.WaitGroup
140133 errs := dm .parallelize (func (d * discovery.PluggableDiscovery ) error {
134+ wg .Add (1 )
141135 state := d .State ()
142136 if state != discovery .Idling || state == discovery .Syncing {
143137 // Already syncing
@@ -150,12 +144,18 @@ func (dm *DiscoveryManager) StartSyncAll() (<-chan *discovery.Event, []error) {
150144 }
151145 go func () {
152146 for ev := range eventCh {
153- dm . globalEventCh <- ev
147+ eventSink <- ev
154148 }
149+ wg .Done ()
155150 }()
156151 return nil
157152 })
158- return dm .globalEventCh , errs
153+ go func () {
154+ wg .Wait ()
155+ eventSink <- & discovery.Event {Type : "quit" }
156+ close (eventSink )
157+ }()
158+ return eventSink , errs
159159}
160160
161161// StopAll the discoveries for this DiscoveryManager,
@@ -189,15 +189,6 @@ func (dm *DiscoveryManager) QuitAll() []error {
189189 }
190190 return nil
191191 })
192- // Close the global channel only if there were no errors
193- // quitting all alive discoveries
194- if len (errs ) == 0 && dm .globalEventCh != nil {
195- // Let events consumers that discoveries are quitting no more events
196- // will be sent on this channel
197- dm .globalEventCh <- & discovery.Event {Type : "quit" }
198- close (dm .globalEventCh )
199- dm .globalEventCh = nil
200- }
201192 return errs
202193}
203194
0 commit comments