@@ -25,12 +25,6 @@ import (
2525)
2626
2727func 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-
3428 // create kqueue
3529 kq , err := syscall .Kqueue ()
3630 if err != nil {
@@ -42,6 +36,7 @@ func startSync() (chan<- bool, error) {
4236 if err != nil {
4337 return nil , err
4438 }
39+
4540 // build kevent
4641 ev1 := syscall.Kevent_t {
4742 Ident : uint64 (fd ),
@@ -57,7 +52,11 @@ func startSync() (chan<- bool, error) {
5752 <- closeChan
5853 }()
5954
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+ }
6160 for _ , port := range current {
6261 outputSyncMessage (& syncOutputJSON {
6362 EventType : "add" ,
@@ -87,16 +86,27 @@ func startSync() (chan<- bool, error) {
8786 go func () {
8887 // wait for events
8988 events := make ([]syscall.Kevent_t , 10 )
89+ retries := 0
9090
9191 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
96106 }
97- // check if there was an event
98- for i := 0 ; i < nev ; i ++ {
99107
108+ for retries > 0 {
109+ retries --
100110 updates , _ := enumerator .GetDetailedPortsList ()
101111
102112 for _ , port := range current {
0 commit comments