@@ -22,12 +22,14 @@ import (
22
22
"github.com/arduino/arduino-cli/arduino/discovery"
23
23
"github.com/arduino/arduino-cli/i18n"
24
24
"github.com/pkg/errors"
25
+ "github.com/sirupsen/logrus"
25
26
)
26
27
27
28
// DiscoveryManager is required to handle multiple pluggable-discovery that
28
29
// may be shared across platforms
29
30
type DiscoveryManager struct {
30
- discoveries map [string ]* discovery.PluggableDiscovery
31
+ discoveriesMutex sync.Mutex
32
+ discoveries map [string ]* discovery.PluggableDiscovery
31
33
}
32
34
33
35
var tr = i18n .Tr
@@ -42,12 +44,16 @@ func New() *DiscoveryManager {
42
44
// Clear resets the DiscoveryManager to its initial state
43
45
func (dm * DiscoveryManager ) Clear () {
44
46
dm .QuitAll ()
47
+ dm .discoveriesMutex .Lock ()
48
+ defer dm .discoveriesMutex .Unlock ()
45
49
dm .discoveries = map [string ]* discovery.PluggableDiscovery {}
46
50
}
47
51
48
52
// IDs returns the list of discoveries' ids in this DiscoveryManager
49
53
func (dm * DiscoveryManager ) IDs () []string {
50
54
ids := []string {}
55
+ dm .discoveriesMutex .Lock ()
56
+ defer dm .discoveriesMutex .Unlock ()
51
57
for id := range dm .discoveries {
52
58
ids = append (ids , id )
53
59
}
@@ -57,19 +63,38 @@ func (dm *DiscoveryManager) IDs() []string {
57
63
// Add adds a discovery to the list of managed discoveries
58
64
func (dm * DiscoveryManager ) Add (disc * discovery.PluggableDiscovery ) error {
59
65
id := disc .GetID ()
66
+ dm .discoveriesMutex .Lock ()
67
+ defer dm .discoveriesMutex .Unlock ()
60
68
if _ , has := dm .discoveries [id ]; has {
61
69
return errors .Errorf (tr ("pluggable discovery already added: %s" ), id )
62
70
}
63
71
dm .discoveries [id ] = disc
64
72
return nil
65
73
}
66
74
75
+ // remove quits and deletes the discovery with specified id
76
+ // from the discoveries managed by this DiscoveryManager
77
+ func (dm * DiscoveryManager ) remove (id string ) {
78
+ dm .discoveriesMutex .Lock ()
79
+ d := dm .discoveries [id ]
80
+ delete (dm .discoveries , id )
81
+ dm .discoveriesMutex .Unlock ()
82
+ d .Quit ()
83
+ logrus .Infof ("Closed and removed discovery %s" , id )
84
+ }
85
+
67
86
// parallelize runs function f concurrently for each discovery.
68
87
// Returns a list of errors returned by each call of f.
69
88
func (dm * DiscoveryManager ) parallelize (f func (d * discovery.PluggableDiscovery ) error ) []error {
70
89
var wg sync.WaitGroup
71
90
errChan := make (chan error )
91
+ dm .discoveriesMutex .Lock ()
92
+ discoveries := []* discovery.PluggableDiscovery {}
72
93
for _ , d := range dm .discoveries {
94
+ discoveries = append (discoveries , d )
95
+ }
96
+ dm .discoveriesMutex .Unlock ()
97
+ for _ , d := range discoveries {
73
98
wg .Add (1 )
74
99
go func (d * discovery.PluggableDiscovery ) {
75
100
defer wg .Done ()
@@ -103,6 +128,7 @@ func (dm *DiscoveryManager) RunAll() []error {
103
128
}
104
129
105
130
if err := d .Run (); err != nil {
131
+ dm .remove (d .GetID ())
106
132
return fmt .Errorf (tr ("discovery %[1]s process not started: %[2]w" ), d .GetID (), err )
107
133
}
108
134
return nil
@@ -119,6 +145,7 @@ func (dm *DiscoveryManager) StartAll() []error {
119
145
return nil
120
146
}
121
147
if err := d .Start (); err != nil {
148
+ dm .remove (d .GetID ())
122
149
return fmt .Errorf (tr ("starting discovery %[1]s: %[2]w" ), d .GetID (), err )
123
150
}
124
151
return nil
@@ -139,6 +166,7 @@ func (dm *DiscoveryManager) StartSyncAll() (<-chan *discovery.Event, []error) {
139
166
140
167
eventCh , err := d .StartSync (5 )
141
168
if err != nil {
169
+ dm .remove (d .GetID ())
142
170
return fmt .Errorf (tr ("start syncing discovery %[1]s: %[2]w" ), d .GetID (), err )
143
171
}
144
172
@@ -170,6 +198,7 @@ func (dm *DiscoveryManager) StopAll() []error {
170
198
}
171
199
172
200
if err := d .Stop (); err != nil {
201
+ dm .remove (d .GetID ())
173
202
return fmt .Errorf (tr ("stopping discovery %[1]s: %[2]w" ), d .GetID (), err )
174
203
}
175
204
return nil
@@ -185,9 +214,7 @@ func (dm *DiscoveryManager) QuitAll() []error {
185
214
return nil
186
215
}
187
216
188
- if err := d .Quit (); err != nil {
189
- return fmt .Errorf (tr ("quitting discovery %[1]s: %[2]w" ), d .GetID (), err )
190
- }
217
+ d .Quit ()
191
218
return nil
192
219
})
193
220
return errs
@@ -204,7 +231,13 @@ func (dm *DiscoveryManager) List() ([]*discovery.Port, []error) {
204
231
Port * discovery.Port
205
232
}
206
233
msgChan := make (chan listMsg )
234
+ dm .discoveriesMutex .Lock ()
235
+ discoveries := []* discovery.PluggableDiscovery {}
207
236
for _ , d := range dm .discoveries {
237
+ discoveries = append (discoveries , d )
238
+ }
239
+ dm .discoveriesMutex .Unlock ()
240
+ for _ , d := range discoveries {
208
241
wg .Add (1 )
209
242
go func (d * discovery.PluggableDiscovery ) {
210
243
defer wg .Done ()
@@ -243,7 +276,13 @@ func (dm *DiscoveryManager) List() ([]*discovery.Port, []error) {
243
276
// ListCachedPorts return the current list of ports detected from all discoveries
244
277
func (dm * DiscoveryManager ) ListCachedPorts () []* discovery.Port {
245
278
res := []* discovery.Port {}
279
+ dm .discoveriesMutex .Lock ()
280
+ discoveries := []* discovery.PluggableDiscovery {}
246
281
for _ , d := range dm .discoveries {
282
+ discoveries = append (discoveries , d )
283
+ }
284
+ dm .discoveriesMutex .Unlock ()
285
+ for _ , d := range discoveries {
247
286
if d .State () != discovery .Syncing {
248
287
// Discovery is not syncing
249
288
continue
0 commit comments