Skip to content

Commit 49985f3

Browse files
committed
MacOSX: ports requires up to 500ms to enumerate
We may require to bump up this timeout in the future...
1 parent 92d68e7 commit 49985f3

File tree

1 file changed

+23
-13
lines changed

1 file changed

+23
-13
lines changed

sync_darwin.go

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,6 @@ import (
2525
)
2626

2727
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-
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

Comments
 (0)