File tree Expand file tree Collapse file tree 1 file changed +20
-10
lines changed Expand file tree Collapse file tree 1 file changed +20
-10
lines changed Original file line number Diff line number Diff line change @@ -260,29 +260,39 @@ func (c *Conn) SetNodeCallback(callback func(node *Node)) {
260
260
DERPLatency : c .lastDERPLatency ,
261
261
}
262
262
}
263
+ // A send queue must be used so nodes are sent in order.
264
+ queue := make (chan * Node , 16 )
265
+ go func () {
266
+ defer close (queue )
267
+ for {
268
+ select {
269
+ case <- c .closed :
270
+ return
271
+ case node := <- queue :
272
+ callback (node )
273
+ }
274
+ }
275
+ }()
263
276
c .wireguardEngine .SetNetInfoCallback (func (ni * tailcfg.NetInfo ) {
264
277
c .lastMutex .Lock ()
265
278
c .lastPreferredDERP = ni .PreferredDERP
266
279
c .lastDERPLatency = ni .DERPLatency
267
280
node := makeNode ()
281
+ queue <- node
268
282
c .lastMutex .Unlock ()
269
- callback (node )
270
283
})
271
284
c .wireguardEngine .SetStatusCallback (func (s * wgengine.Status , err error ) {
272
285
if err != nil {
273
286
return
274
287
}
275
- endpoints := make ([]string , 0 , len (s .LocalAddrs ))
288
+ c .lastMutex .Lock ()
289
+ c .lastEndpoints = make ([]string , 0 , len (s .LocalAddrs ))
276
290
for _ , addr := range s .LocalAddrs {
277
- endpoints = append (endpoints , addr .Addr .String ())
291
+ c . lastEndpoints = append (c . lastEndpoints , addr .Addr .String ())
278
292
}
279
- go func () {
280
- c .lastMutex .Lock ()
281
- c .lastEndpoints = endpoints
282
- node := makeNode ()
283
- c .lastMutex .Unlock ()
284
- callback (node )
285
- }()
293
+ node := makeNode ()
294
+ queue <- node
295
+ c .lastMutex .Unlock ()
286
296
})
287
297
}
288
298
You can’t perform that action at this time.
0 commit comments