Skip to content

Commit

Permalink
Add mutex to guard discoveries in DiscoveryManager
Browse files Browse the repository at this point in the history
  • Loading branch information
silvanocerza committed Feb 17, 2022
1 parent 34f33cf commit babb858
Showing 1 changed file with 26 additions and 1 deletion.
27 changes: 26 additions & 1 deletion arduino/discovery/discoverymanager/discoverymanager.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ import (
// DiscoveryManager is required to handle multiple pluggable-discovery that
// may be shared across platforms
type DiscoveryManager struct {
discoveries map[string]*discovery.PluggableDiscovery
discoveriesMutex sync.Mutex
discoveries map[string]*discovery.PluggableDiscovery
}

var tr = i18n.Tr
Expand All @@ -43,12 +44,16 @@ func New() *DiscoveryManager {
// Clear resets the DiscoveryManager to its initial state
func (dm *DiscoveryManager) Clear() {
dm.QuitAll()
dm.discoveriesMutex.Lock()
defer dm.discoveriesMutex.Unlock()
dm.discoveries = map[string]*discovery.PluggableDiscovery{}
}

// IDs returns the list of discoveries' ids in this DiscoveryManager
func (dm *DiscoveryManager) IDs() []string {
ids := []string{}
dm.discoveriesMutex.Lock()
defer dm.discoveriesMutex.Unlock()
for id := range dm.discoveries {
ids = append(ids, id)
}
Expand All @@ -58,6 +63,8 @@ func (dm *DiscoveryManager) IDs() []string {
// Add adds a discovery to the list of managed discoveries
func (dm *DiscoveryManager) Add(disc *discovery.PluggableDiscovery) error {
id := disc.GetID()
dm.discoveriesMutex.Lock()
defer dm.discoveriesMutex.Unlock()
if _, has := dm.discoveries[id]; has {
return errors.Errorf(tr("pluggable discovery already added: %s"), id)
}
Expand All @@ -78,7 +85,13 @@ func (dm *DiscoveryManager) remove(id string) {
func (dm *DiscoveryManager) parallelize(f func(d *discovery.PluggableDiscovery) error) []error {
var wg sync.WaitGroup
errChan := make(chan error)
dm.discoveriesMutex.Lock()
discoveries := []*discovery.PluggableDiscovery{}
for _, d := range dm.discoveries {
discoveries = append(discoveries, d)
}
dm.discoveriesMutex.Unlock()
for _, d := range discoveries {
wg.Add(1)
go func(d *discovery.PluggableDiscovery) {
defer wg.Done()
Expand Down Expand Up @@ -215,7 +228,13 @@ func (dm *DiscoveryManager) List() ([]*discovery.Port, []error) {
Port *discovery.Port
}
msgChan := make(chan listMsg)
dm.discoveriesMutex.Lock()
discoveries := []*discovery.PluggableDiscovery{}
for _, d := range dm.discoveries {
discoveries = append(discoveries, d)
}
dm.discoveriesMutex.Unlock()
for _, d := range discoveries {
wg.Add(1)
go func(d *discovery.PluggableDiscovery) {
defer wg.Done()
Expand Down Expand Up @@ -254,7 +273,13 @@ func (dm *DiscoveryManager) List() ([]*discovery.Port, []error) {
// ListCachedPorts return the current list of ports detected from all discoveries
func (dm *DiscoveryManager) ListCachedPorts() []*discovery.Port {
res := []*discovery.Port{}
dm.discoveriesMutex.Lock()
discoveries := []*discovery.PluggableDiscovery{}
for _, d := range dm.discoveries {
discoveries = append(discoveries, d)
}
dm.discoveriesMutex.Unlock()
for _, d := range discoveries {
if d.State() != discovery.Syncing {
// Discovery is not syncing
continue
Expand Down

0 comments on commit babb858

Please sign in to comment.