Skip to content

Commit 97bcbfe

Browse files
committed
Fix darwin monitor socket leak
1 parent db70908 commit 97bcbfe

1 file changed

Lines changed: 24 additions & 8 deletions

File tree

monitor_darwin.go

Lines changed: 24 additions & 8 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(100 * time.Millisecond):
46+
}
3747
err := m.loopUpdate0()
3848
if err != nil {
3949
m.logger.Error("listen network update: ", err)
@@ -47,12 +57,15 @@ 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

5466
func (m *networkUpdateMonitor) loopUpdate1(routeSocketFile *os.File) {
55-
defer routeSocketFile.Close()
67+
done := make(chan struct{})
68+
defer close(done)
5669
buffer := buf.NewPacket()
5770
defer buffer.Release()
5871
n, err := routeSocketFile.Read(buffer.FreeBytes())
@@ -73,7 +86,10 @@ func (m *networkUpdateMonitor) loopUpdate1(routeSocketFile *os.File) {
7386
}
7487

7588
func (m *networkUpdateMonitor) Close() error {
76-
return unix.Close(m.routeSocket)
89+
m.closeOnce.Do(func() {
90+
close(m.done)
91+
})
92+
return nil
7793
}
7894

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

0 commit comments

Comments
 (0)