Skip to content

Commit babb858

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

File tree

1 file changed

+26
-1
lines changed

1 file changed

+26
-1
lines changed

arduino/discovery/discoverymanager/discoverymanager.go

+26-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
}
@@ -78,7 +85,13 @@ func (dm *DiscoveryManager) remove(id string) {
7885
func (dm *DiscoveryManager) parallelize(f func(d *discovery.PluggableDiscovery) error) []error {
7986
var wg sync.WaitGroup
8087
errChan := make(chan error)
88+
dm.discoveriesMutex.Lock()
89+
discoveries := []*discovery.PluggableDiscovery{}
8190
for _, d := range dm.discoveries {
91+
discoveries = append(discoveries, d)
92+
}
93+
dm.discoveriesMutex.Unlock()
94+
for _, d := range discoveries {
8295
wg.Add(1)
8396
go func(d *discovery.PluggableDiscovery) {
8497
defer wg.Done()
@@ -215,7 +228,13 @@ func (dm *DiscoveryManager) List() ([]*discovery.Port, []error) {
215228
Port *discovery.Port
216229
}
217230
msgChan := make(chan listMsg)
231+
dm.discoveriesMutex.Lock()
232+
discoveries := []*discovery.PluggableDiscovery{}
218233
for _, d := range dm.discoveries {
234+
discoveries = append(discoveries, d)
235+
}
236+
dm.discoveriesMutex.Unlock()
237+
for _, d := range discoveries {
219238
wg.Add(1)
220239
go func(d *discovery.PluggableDiscovery) {
221240
defer wg.Done()
@@ -254,7 +273,13 @@ func (dm *DiscoveryManager) List() ([]*discovery.Port, []error) {
254273
// ListCachedPorts return the current list of ports detected from all discoveries
255274
func (dm *DiscoveryManager) ListCachedPorts() []*discovery.Port {
256275
res := []*discovery.Port{}
276+
dm.discoveriesMutex.Lock()
277+
discoveries := []*discovery.PluggableDiscovery{}
257278
for _, d := range dm.discoveries {
279+
discoveries = append(discoveries, d)
280+
}
281+
dm.discoveriesMutex.Unlock()
282+
for _, d := range discoveries {
258283
if d.State() != discovery.Syncing {
259284
// Discovery is not syncing
260285
continue

0 commit comments

Comments
 (0)