Skip to content

Commit ecc768f

Browse files
committed
Cache active ports and transmit them when a new watcher connects
1 parent 66506e6 commit ecc768f

File tree

1 file changed

+37
-12
lines changed

1 file changed

+37
-12
lines changed

arduino/discovery/discoverymanager/discoverymanager.go

+37-12
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,18 @@ type DiscoveryManager struct {
3434
feed chan *discovery.Event
3535
watchersMutex sync.Mutex
3636
watchers map[*PortWatcher]bool
37+
watchersCache map[string]map[string]*discovery.Event
3738
}
3839

3940
var tr = i18n.Tr
4041

4142
// New creates a new DiscoveryManager
4243
func New() *DiscoveryManager {
4344
return &DiscoveryManager{
44-
discoveries: map[string]*discovery.PluggableDiscovery{},
45-
watchers: map[*PortWatcher]bool{},
46-
feed: make(chan *discovery.Event, 50),
45+
discoveries: map[string]*discovery.PluggableDiscovery{},
46+
watchers: map[*PortWatcher]bool{},
47+
feed: make(chan *discovery.Event, 50),
48+
watchersCache: map[string]map[string]*discovery.Event{},
4749
}
4850
}
4951

@@ -139,9 +141,16 @@ func (dm *DiscoveryManager) Watch() (*PortWatcher, error) {
139141
dm.watchersMutex.Unlock()
140142
close(watcher.feed)
141143
}
142-
dm.watchersMutex.Lock()
143-
dm.watchers[watcher] = true
144-
dm.watchersMutex.Unlock()
144+
go func() {
145+
dm.watchersMutex.Lock()
146+
for _, cache := range dm.watchersCache {
147+
for _, ev := range cache {
148+
watcher.feed <- ev
149+
}
150+
}
151+
dm.watchers[watcher] = true
152+
dm.watchersMutex.Unlock()
153+
}()
145154
return watcher, nil
146155
}
147156

@@ -190,19 +199,35 @@ func (dm *DiscoveryManager) feeder() {
190199
}
191200

192201
func (dm *DiscoveryManager) cacheEvent(ev *discovery.Event) {
193-
// XXX: TODO
202+
cache := dm.watchersCache[ev.DiscoveryID]
203+
if cache == nil {
204+
cache = map[string]*discovery.Event{}
205+
dm.watchersCache[ev.DiscoveryID] = cache
206+
}
207+
208+
eventID := ev.Port.Address + "|" + ev.Port.Protocol
209+
switch ev.Type {
210+
case "add":
211+
cache[eventID] = ev
212+
case "remove":
213+
delete(cache, eventID)
214+
default:
215+
logrus.Errorf("Unhandled event from discovery: %s", ev.Type)
216+
return
217+
}
194218
}
195219

196220
// List return the current list of ports detected from all discoveries
197221
func (dm *DiscoveryManager) List() []*discovery.Port {
198222
dm.Start()
199223

200-
// XXX: Cache ports and return them
201-
dm.discoveriesMutex.Lock()
202-
defer dm.discoveriesMutex.Unlock()
203224
res := []*discovery.Port{}
204-
for _, d := range dm.discoveries {
205-
res = append(res, d.ListCachedPorts()...)
225+
dm.watchersMutex.Lock()
226+
defer dm.watchersMutex.Unlock()
227+
for _, cache := range dm.watchersCache {
228+
for _, ev := range cache {
229+
res = append(res, ev.Port)
230+
}
206231
}
207232
return res
208233
}

0 commit comments

Comments
 (0)