@@ -25,12 +25,6 @@ import (
25
25
)
26
26
27
27
func startSync () (chan <- bool , error ) {
28
- // Get the current port list to send as initial "add" events
29
- current , err := enumerator .GetDetailedPortsList ()
30
- if err != nil {
31
- return nil , err
32
- }
33
-
34
28
// create kqueue
35
29
kq , err := syscall .Kqueue ()
36
30
if err != nil {
@@ -42,6 +36,7 @@ func startSync() (chan<- bool, error) {
42
36
if err != nil {
43
37
return nil , err
44
38
}
39
+
45
40
// build kevent
46
41
ev1 := syscall.Kevent_t {
47
42
Ident : uint64 (fd ),
@@ -57,7 +52,11 @@ func startSync() (chan<- bool, error) {
57
52
<- closeChan
58
53
}()
59
54
60
- // Ouput initial port state
55
+ // Ouput initial port state: get the current port list to send as initial "add" events
56
+ current , err := enumerator .GetDetailedPortsList ()
57
+ if err != nil {
58
+ return nil , err
59
+ }
61
60
for _ , port := range current {
62
61
outputSyncMessage (& syncOutputJSON {
63
62
EventType : "add" ,
@@ -87,16 +86,27 @@ func startSync() (chan<- bool, error) {
87
86
go func () {
88
87
// wait for events
89
88
events := make ([]syscall.Kevent_t , 10 )
89
+ retries := 0
90
90
91
91
for {
92
- // create kevent
93
- nev , err := syscall .Kevent (kq , []syscall.Kevent_t {ev1 }, events , nil )
94
- if err != nil {
95
- outputError (fmt .Errorf ("error decoding START_SYNC event: %s" , err ))
92
+ for {
93
+ t100ms := syscall.Timespec {Nsec : 100000000 , Sec : 0 }
94
+ n , err := syscall .Kevent (kq , []syscall.Kevent_t {ev1 }, events , & t100ms )
95
+ if err == syscall .EINTR {
96
+ continue
97
+ }
98
+ if err != nil {
99
+ outputError (fmt .Errorf ("error decoding START_SYNC event: %s" , err ))
100
+ }
101
+ // if there is an event retry up to 5 times
102
+ if n > 0 {
103
+ retries = 5
104
+ }
105
+ break
96
106
}
97
- // check if there was an event
98
- for i := 0 ; i < nev ; i ++ {
99
107
108
+ for retries > 0 {
109
+ retries --
100
110
updates , _ := enumerator .GetDetailedPortsList ()
101
111
102
112
for _ , port := range current {
0 commit comments