@@ -125,9 +125,9 @@ func (disc *Client) jsonDecodeLoop(in io.Reader, outChan chan<- *discoveryMessag
125
125
closeAndReportError := func (err error ) {
126
126
disc .statusMutex .Lock ()
127
127
disc .incomingMessagesError = err
128
- disc .statusMutex .Unlock ()
129
128
disc .stopSync ()
130
129
disc .killProcess ()
130
+ disc .statusMutex .Unlock ()
131
131
close (outChan )
132
132
if err != nil {
133
133
disc .logger .Errorf ("Stopped decode loop: %v" , err )
@@ -138,11 +138,7 @@ func (disc *Client) jsonDecodeLoop(in io.Reader, outChan chan<- *discoveryMessag
138
138
139
139
for {
140
140
var msg discoveryMessage
141
- if err := decoder .Decode (& msg ); errors .Is (err , io .EOF ) {
142
- // This is fine :flames: we exit gracefully
143
- closeAndReportError (nil )
144
- return
145
- } else if err != nil {
141
+ if err := decoder .Decode (& msg ); err != nil {
146
142
closeAndReportError (err )
147
143
return
148
144
}
@@ -184,7 +180,10 @@ func (disc *Client) waitMessage(timeout time.Duration) (*discoveryMessage, error
184
180
select {
185
181
case msg := <- disc .incomingMessagesChan :
186
182
if msg == nil {
187
- return nil , disc .incomingMessagesError
183
+ disc .statusMutex .Lock ()
184
+ err := disc .incomingMessagesError
185
+ disc .statusMutex .Unlock ()
186
+ return nil , err
188
187
}
189
188
return msg , nil
190
189
case <- time .After (timeout ):
@@ -239,9 +238,6 @@ func (disc *Client) runProcess() error {
239
238
}
240
239
241
240
func (disc * Client ) killProcess () {
242
- disc .statusMutex .Lock ()
243
- defer disc .statusMutex .Unlock ()
244
-
245
241
disc .logger .Debugf ("Killing discovery process" )
246
242
if process := disc .process ; process != nil {
247
243
disc .process = nil
@@ -270,7 +266,9 @@ func (disc *Client) Run() (err error) {
270
266
if err == nil {
271
267
return
272
268
}
269
+ disc .statusMutex .Lock ()
273
270
disc .killProcess ()
271
+ disc .statusMutex .Unlock ()
274
272
}()
275
273
276
274
if err = disc .sendCommand ("HELLO 1 \" arduino-cli " + disc .userAgent + "\" \n " ); err != nil {
@@ -287,8 +285,6 @@ func (disc *Client) Run() (err error) {
287
285
} else if msg .ProtocolVersion > 1 {
288
286
return fmt .Errorf ("protocol version not supported: requested 1, got %d" , msg .ProtocolVersion )
289
287
}
290
- disc .statusMutex .Lock ()
291
- defer disc .statusMutex .Unlock ()
292
288
return nil
293
289
}
294
290
@@ -307,8 +303,6 @@ func (disc *Client) Start() error {
307
303
} else if strings .ToUpper (msg .Message ) != "OK" {
308
304
return fmt .Errorf ("communication out of sync, expected 'OK', received '%s'" , msg .Message )
309
305
}
310
- disc .statusMutex .Lock ()
311
- defer disc .statusMutex .Unlock ()
312
306
return nil
313
307
}
314
308
@@ -348,8 +342,10 @@ func (disc *Client) Quit() {
348
342
if _ , err := disc .waitMessage (time .Second * 5 ); err != nil {
349
343
disc .logger .Errorf ("Quitting discovery: %s" , err )
350
344
}
345
+ disc .statusMutex .Lock ()
351
346
disc .stopSync ()
352
347
disc .killProcess ()
348
+ disc .statusMutex .Unlock ()
353
349
}
354
350
355
351
// List executes an enumeration of the ports and returns a list of the available
@@ -377,9 +373,6 @@ func (disc *Client) List() ([]*Port, error) {
377
373
// The event channel must be consumed as quickly as possible since it may block the
378
374
// discovery if it becomes full. The channel size is configurable.
379
375
func (disc * Client ) StartSync (size int ) (<- chan * Event , error ) {
380
- disc .statusMutex .Lock ()
381
- defer disc .statusMutex .Unlock ()
382
-
383
376
if err := disc .sendCommand ("START_SYNC\n " ); err != nil {
384
377
return nil , err
385
378
}
@@ -395,6 +388,8 @@ func (disc *Client) StartSync(size int) (<-chan *Event, error) {
395
388
}
396
389
397
390
// In case there is already an existing event channel in use we close it before creating a new one.
391
+ disc .statusMutex .Lock ()
392
+ defer disc .statusMutex .Unlock ()
398
393
disc .stopSync ()
399
394
c := make (chan * Event , size )
400
395
disc .eventChan = c
0 commit comments