Skip to content

Commit 84c454a

Browse files
committed
Add mutex to guard discoveries in DiscoveryManager
1 parent 34f33cf commit 84c454a

File tree

1 file changed

+28
-1
lines changed

1 file changed

+28
-1
lines changed

arduino/discovery/discoverymanager/discoverymanager.go

+28-1
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
}
@@ -69,6 +76,8 @@ func (dm *DiscoveryManager) Add(disc *discovery.PluggableDiscovery) error {
6976
// from the discoveries managed by this DiscoveryManager
7077
func (dm *DiscoveryManager) remove(id string) {
7178
dm.discoveries[id].Quit()
79+
dm.discoveriesMutex.Lock()
80+
defer dm.discoveriesMutex.Unlock()
7281
delete(dm.discoveries, id)
7382
logrus.Infof("Closed and removed discovery %s", id)
7483
}
@@ -78,7 +87,13 @@ func (dm *DiscoveryManager) remove(id string) {
7887
func (dm *DiscoveryManager) parallelize(f func(d *discovery.PluggableDiscovery) error) []error {
7988
var wg sync.WaitGroup
8089
errChan := make(chan error)
90+
dm.discoveriesMutex.Lock()
91+
discoveries := []*discovery.PluggableDiscovery{}
8192
for _, d := range dm.discoveries {
93+
discoveries = append(discoveries, d)
94+
}
95+
dm.discoveriesMutex.Unlock()
96+
for _, d := range discoveries {
8297
wg.Add(1)
8398
go func(d *discovery.PluggableDiscovery) {
8499
defer wg.Done()
@@ -215,7 +230,13 @@ func (dm *DiscoveryManager) List() ([]*discovery.Port, []error) {
215230
Port *discovery.Port
216231
}
217232
msgChan := make(chan listMsg)
233+
dm.discoveriesMutex.Lock()
234+
discoveries := []*discovery.PluggableDiscovery{}
218235
for _, d := range dm.discoveries {
236+
discoveries = append(discoveries, d)
237+
}
238+
dm.discoveriesMutex.Unlock()
239+
for _, d := range discoveries {
219240
wg.Add(1)
220241
go func(d *discovery.PluggableDiscovery) {
221242
defer wg.Done()
@@ -254,7 +275,13 @@ func (dm *DiscoveryManager) List() ([]*discovery.Port, []error) {
254275
// ListCachedPorts return the current list of ports detected from all discoveries
255276
func (dm *DiscoveryManager) ListCachedPorts() []*discovery.Port {
256277
res := []*discovery.Port{}
278+
dm.discoveriesMutex.Lock()
279+
discoveries := []*discovery.PluggableDiscovery{}
257280
for _, d := range dm.discoveries {
281+
discoveries = append(discoveries, d)
282+
}
283+
dm.discoveriesMutex.Unlock()
284+
for _, d := range discoveries {
258285
if d.State() != discovery.Syncing {
259286
// Discovery is not syncing
260287
continue

0 commit comments

Comments
 (0)