Skip to content

Commit 1c038f5

Browse files
committed
wifinina: add mutex to prevent communication race problems
Signed-off-by: deadprogram <[email protected]>
1 parent 36a8b79 commit 1c038f5

File tree

1 file changed

+23
-0
lines changed

1 file changed

+23
-0
lines changed

wifinina/wifinina.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"fmt" // used only in debug printouts and is optimized out when debugging is disabled
1313
"strconv"
1414
"strings"
15+
"sync"
1516
"time"
1617

1718
"machine"
@@ -288,6 +289,7 @@ type Device struct {
288289
proto uint8
289290
ip uint32
290291
port uint16
292+
mu sync.Mutex
291293
}
292294

293295
// New returns a new Wifinina device.
@@ -363,6 +365,9 @@ func (d *Device) GetClientState(sock uint8) (uint8, error) {
363365
}
364366

365367
func (d *Device) SendData(buf []byte, sock uint8) (uint16, error) {
368+
d.mu.Lock()
369+
defer d.mu.Unlock()
370+
366371
if err := d.waitForChipSelect(); err != nil {
367372
d.spiChipDeselect()
368373
return 0, err
@@ -376,6 +381,9 @@ func (d *Device) SendData(buf []byte, sock uint8) (uint16, error) {
376381
}
377382

378383
func (d *Device) CheckDataSent(sock uint8) (bool, error) {
384+
d.mu.Lock()
385+
defer d.mu.Unlock()
386+
379387
var lastErr error
380388
for timeout := 0; timeout < 10; timeout++ {
381389
sent, err := d.getUint8(d.reqUint8(CmdDataSentTCP, sock))
@@ -391,6 +399,9 @@ func (d *Device) CheckDataSent(sock uint8) (bool, error) {
391399
}
392400

393401
func (d *Device) GetDataBuf(sock uint8, buf []byte) (int, error) {
402+
d.mu.Lock()
403+
defer d.mu.Unlock()
404+
394405
if err := d.waitForChipSelect(); err != nil {
395406
d.spiChipDeselect()
396407
return 0, err
@@ -411,6 +422,9 @@ func (d *Device) GetDataBuf(sock uint8, buf []byte) (int, error) {
411422
}
412423

413424
func (d *Device) StopClient(sock uint8) error {
425+
d.mu.Lock()
426+
defer d.mu.Unlock()
427+
414428
if _debug {
415429
println("[StopClient] called StopClient()\r")
416430
}
@@ -419,6 +433,9 @@ func (d *Device) StopClient(sock uint8) error {
419433
}
420434

421435
func (d *Device) StartServer(port uint16, sock uint8, mode uint8) error {
436+
d.mu.Lock()
437+
defer d.mu.Unlock()
438+
422439
if err := d.waitForChipSelect(); err != nil {
423440
d.spiChipDeselect()
424441
return err
@@ -435,6 +452,9 @@ func (d *Device) StartServer(port uint16, sock uint8, mode uint8) error {
435452

436453
// InsertDataBuf adds data to the buffer used for sending UDP data
437454
func (d *Device) InsertDataBuf(buf []byte, sock uint8) (bool, error) {
455+
d.mu.Lock()
456+
defer d.mu.Unlock()
457+
438458
if err := d.waitForChipSelect(); err != nil {
439459
d.spiChipDeselect()
440460
return false, err
@@ -450,6 +470,9 @@ func (d *Device) InsertDataBuf(buf []byte, sock uint8) (bool, error) {
450470

451471
// SendUDPData sends the data previously added to the UDP buffer
452472
func (d *Device) SendUDPData(sock uint8) (bool, error) {
473+
d.mu.Lock()
474+
defer d.mu.Unlock()
475+
453476
if err := d.waitForChipSelect(); err != nil {
454477
d.spiChipDeselect()
455478
return false, err

0 commit comments

Comments
 (0)