Skip to content

Commit 7545dc2

Browse files
committed
Fix darwin monitor socket leak
1 parent db70908 commit 7545dc2

1 file changed

Lines changed: 22 additions & 7 deletions

File tree

monitor_darwin.go

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,19 @@ import (
1717
)
1818

1919
type networkUpdateMonitor struct {
20-
access sync.Mutex
21-
callbacks list.List[NetworkUpdateCallback]
22-
routeSocket int
23-
logger logger.Logger
20+
access sync.Mutex
21+
callbacks list.List[NetworkUpdateCallback]
22+
routeSocketFile *os.File
23+
closeOnce sync.Once
24+
done chan struct{}
25+
logger logger.Logger
2426
}
2527

2628
func NewNetworkUpdateMonitor(logger logger.Logger) (NetworkUpdateMonitor, error) {
27-
return &networkUpdateMonitor{logger: logger}, nil
29+
return &networkUpdateMonitor{
30+
logger: logger,
31+
done: make(chan struct{}),
32+
}, nil
2833
}
2934

3035
func (m *networkUpdateMonitor) Start() error {
@@ -34,6 +39,11 @@ func (m *networkUpdateMonitor) Start() error {
3439

3540
func (m *networkUpdateMonitor) loopUpdate() {
3641
for {
42+
select {
43+
case <-m.done:
44+
return
45+
case <-time.After(time.Second):
46+
}
3747
err := m.loopUpdate0()
3848
if err != nil {
3949
m.logger.Error("listen network update: ", err)
@@ -47,7 +57,9 @@ func (m *networkUpdateMonitor) loopUpdate0() error {
4757
if err != nil {
4858
return err
4959
}
50-
m.loopUpdate1(os.NewFile(uintptr(routeSocket), "route"))
60+
routeSocketFile := os.NewFile(uintptr(routeSocket), "route")
61+
m.routeSocketFile = routeSocketFile
62+
m.loopUpdate1(routeSocketFile)
5163
return nil
5264
}
5365

@@ -73,7 +85,10 @@ func (m *networkUpdateMonitor) loopUpdate1(routeSocketFile *os.File) {
7385
}
7486

7587
func (m *networkUpdateMonitor) Close() error {
76-
return unix.Close(m.routeSocket)
88+
m.closeOnce.Do(func() {
89+
close(m.done)
90+
})
91+
return nil
7792
}
7893

7994
func (m *defaultInterfaceMonitor) checkUpdate() error {

0 commit comments

Comments
 (0)