6
6
"encoding/json"
7
7
"strconv"
8
8
"strings"
9
+ "sync"
9
10
"time"
10
11
11
12
"github.com/arduino/arduino-create-agent/upload"
@@ -29,11 +30,14 @@ type serialhub struct {
29
30
30
31
// Unregister requests from connections.
31
32
unregister chan * serport
33
+
34
+ mu sync.Mutex
32
35
}
33
36
34
37
type SpPortList struct {
35
38
Ports []SpPortItem
36
39
Network bool
40
+ mu sync.Mutex `json:"-"`
37
41
}
38
42
39
43
type SpPortItem struct {
@@ -72,15 +76,19 @@ func (sh *serialhub) run() {
72
76
for {
73
77
select {
74
78
case p := <- sh .register :
79
+ sh .mu .Lock ()
75
80
//log.Print("Registering a port: ", p.portConf.Name)
76
81
h .broadcastSys <- []byte ("{\" Cmd\" :\" Open\" ,\" Desc\" :\" Got register/open on port.\" ,\" Port\" :\" " + p .portConf .Name + "\" ,\" Baud\" :" + strconv .Itoa (p .portConf .Baud ) + ",\" BufferType\" :\" " + p .BufferType + "\" }" )
77
82
sh .ports [p ] = true
83
+ sh .mu .Unlock ()
78
84
case p := <- sh .unregister :
85
+ sh .mu .Lock ()
79
86
//log.Print("Unregistering a port: ", p.portConf.Name)
80
87
h .broadcastSys <- []byte ("{\" Cmd\" :\" Close\" ,\" Desc\" :\" Got unregister/close on port.\" ,\" Port\" :\" " + p .portConf .Name + "\" ,\" Baud\" :" + strconv .Itoa (p .portConf .Baud ) + "}" )
81
88
delete (sh .ports , p )
82
89
close (p .sendBuffered )
83
90
close (p .sendNoBuf )
91
+ sh .mu .Unlock ()
84
92
case wr := <- sh .write :
85
93
// if user sent in the commands as one text mode line
86
94
write (wr )
@@ -102,13 +110,17 @@ func write(wr writeRequest) {
102
110
103
111
// spList broadcasts a Json representation of the ports found
104
112
func spList (network bool ) {
105
- var list SpPortList
113
+ var ls []byte
114
+ var err error
106
115
if network {
107
- list = NetworkPorts
116
+ NetworkPorts .mu .Lock ()
117
+ ls , err = json .MarshalIndent (NetworkPorts , "" , "\t " )
118
+ NetworkPorts .mu .Unlock ()
108
119
} else {
109
- list = SerialPorts
120
+ SerialPorts .mu .Lock ()
121
+ ls , err = json .MarshalIndent (SerialPorts , "" , "\t " )
122
+ SerialPorts .mu .Unlock ()
110
123
}
111
- ls , err := json .MarshalIndent (list , "" , "\t " )
112
124
if err != nil {
113
125
//log.Println(err)
114
126
h .broadcastSys <- []byte ("Error creating json on port list " +
@@ -120,10 +132,14 @@ func spList(network bool) {
120
132
121
133
// discoverLoop periodically update the list of ports found
122
134
func discoverLoop () {
135
+ SerialPorts .mu .Lock ()
123
136
SerialPorts .Network = false
124
137
SerialPorts .Ports = make ([]SpPortItem , 0 )
138
+ SerialPorts .mu .Unlock ()
139
+ NetworkPorts .mu .Lock ()
125
140
NetworkPorts .Network = true
126
141
NetworkPorts .Ports = make ([]SpPortItem , 0 )
142
+ NetworkPorts .mu .Unlock ()
127
143
128
144
go func () {
129
145
for {
@@ -184,13 +200,13 @@ func spListDual(network bool) {
184
200
// to append the open/close state, baud rates, etc to make
185
201
// a super clean nice list to send back to browser
186
202
n := len (list )
187
- spl := SpPortList { make ([]SpPortItem , n , n ), network }
203
+ spl := make ([]SpPortItem , n )
188
204
189
205
ctr := 0
190
206
191
207
for _ , item := range list {
192
208
193
- spl . Ports [ctr ] = SpPortItem {
209
+ spl [ctr ] = SpPortItem {
194
210
Name : item .Name ,
195
211
SerialNumber : item .ISerial ,
196
212
DeviceClass : item .DeviceClass ,
@@ -209,17 +225,21 @@ func spListDual(network bool) {
209
225
210
226
if isFound {
211
227
// we found our port
212
- spl . Ports [ctr ].IsOpen = true
213
- spl . Ports [ctr ].Baud = myport .portConf .Baud
214
- spl . Ports [ctr ].BufferAlgorithm = myport .BufferType
228
+ spl [ctr ].IsOpen = true
229
+ spl [ctr ].Baud = myport .portConf .Baud
230
+ spl [ctr ].BufferAlgorithm = myport .BufferType
215
231
}
216
232
ctr ++
217
233
}
218
234
219
235
if network {
220
- NetworkPorts = spl
236
+ NetworkPorts .mu .Lock ()
237
+ NetworkPorts .Ports = spl
238
+ NetworkPorts .mu .Unlock ()
221
239
} else {
222
- SerialPorts = spl
240
+ SerialPorts .mu .Lock ()
241
+ SerialPorts .Ports = spl
242
+ SerialPorts .mu .Unlock ()
223
243
}
224
244
}
225
245
0 commit comments