Skip to content

Commit 8064d10

Browse files
committed
Add mutex to guard discoveries in DiscoveryManager
1 parent 34f33cf commit 8064d10

File tree

1 file changed

+30
-2
lines changed

1 file changed

+30
-2
lines changed

arduino/discovery/discoverymanager/discoverymanager.go

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ import (
2828
// DiscoveryManager is required to handle multiple pluggable-discovery that
2929
// may be shared across platforms
3030
type DiscoveryManager struct {
31-
discoveries map[string]*discovery.PluggableDiscovery
31+
discoveriesMutex sync.Mutex
32+
discoveries map[string]*discovery.PluggableDiscovery
3233
}
3334

3435
var tr = i18n.Tr
@@ -43,12 +44,16 @@ func New() *DiscoveryManager {
4344
// Clear resets the DiscoveryManager to its initial state
4445
func (dm *DiscoveryManager) Clear() {
4546
dm.QuitAll()
47+
dm.discoveriesMutex.Lock()
48+
defer dm.discoveriesMutex.Unlock()
4649
dm.discoveries = map[string]*discovery.PluggableDiscovery{}
4750
}
4851

4952
// IDs returns the list of discoveries' ids in this DiscoveryManager
5053
func (dm *DiscoveryManager) IDs() []string {
5154
ids := []string{}
55+
dm.discoveriesMutex.Lock()
56+
defer dm.discoveriesMutex.Unlock()
5257
for id := range dm.discoveries {
5358
ids = append(ids, id)
5459
}
@@ -58,6 +63,8 @@ func (dm *DiscoveryManager) IDs() []string {
5863
// Add adds a discovery to the list of managed discoveries
5964
func (dm *DiscoveryManager) Add(disc *discovery.PluggableDiscovery) error {
6065
id := disc.GetID()
66+
dm.discoveriesMutex.Lock()
67+
defer dm.discoveriesMutex.Unlock()
6168
if _, has := dm.discoveries[id]; has {
6269
return errors.Errorf(tr("pluggable discovery already added: %s"), id)
6370
}
@@ -68,8 +75,11 @@ func (dm *DiscoveryManager) Add(disc *discovery.PluggableDiscovery) error {
6875
// remove quits and deletes the discovery with specified id
6976
// from the discoveries managed by this DiscoveryManager
7077
func (dm *DiscoveryManager) remove(id string) {
71-
dm.discoveries[id].Quit()
78+
dm.discoveriesMutex.Lock()
79+
d := dm.discoveries[id]
7280
delete(dm.discoveries, id)
81+
dm.discoveriesMutex.Unlock()
82+
d.Quit()
7383
logrus.Infof("Closed and removed discovery %s", id)
7484
}
7585

@@ -78,7 +88,13 @@ func (dm *DiscoveryManager) remove(id string) {
7888
func (dm *DiscoveryManager) parallelize(f func(d *discovery.PluggableDiscovery) error) []error {
7989
var wg sync.WaitGroup
8090
errChan := make(chan error)
91+
dm.discoveriesMutex.Lock()
92+
discoveries := []*discovery.PluggableDiscovery{}
8193
for _, d := range dm.discoveries {
94+
discoveries = append(discoveries, d)
95+
}
96+
dm.discoveriesMutex.Unlock()
97+
for _, d := range discoveries {
8298
wg.Add(1)
8399
go func(d *discovery.PluggableDiscovery) {
84100
defer wg.Done()
@@ -215,7 +231,13 @@ func (dm *DiscoveryManager) List() ([]*discovery.Port, []error) {
215231
Port *discovery.Port
216232
}
217233
msgChan := make(chan listMsg)
234+
dm.discoveriesMutex.Lock()
235+
discoveries := []*discovery.PluggableDiscovery{}
218236
for _, d := range dm.discoveries {
237+
discoveries = append(discoveries, d)
238+
}
239+
dm.discoveriesMutex.Unlock()
240+
for _, d := range discoveries {
219241
wg.Add(1)
220242
go func(d *discovery.PluggableDiscovery) {
221243
defer wg.Done()
@@ -254,7 +276,13 @@ func (dm *DiscoveryManager) List() ([]*discovery.Port, []error) {
254276
// ListCachedPorts return the current list of ports detected from all discoveries
255277
func (dm *DiscoveryManager) ListCachedPorts() []*discovery.Port {
256278
res := []*discovery.Port{}
279+
dm.discoveriesMutex.Lock()
280+
discoveries := []*discovery.PluggableDiscovery{}
257281
for _, d := range dm.discoveries {
282+
discoveries = append(discoveries, d)
283+
}
284+
dm.discoveriesMutex.Unlock()
285+
for _, d := range discoveries {
258286
if d.State() != discovery.Syncing {
259287
// Discovery is not syncing
260288
continue

0 commit comments

Comments
 (0)