@@ -17,14 +17,19 @@ import (
1717)
1818
1919type 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
2628func 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
3035func (m * networkUpdateMonitor ) Start () error {
@@ -34,6 +39,11 @@ func (m *networkUpdateMonitor) Start() error {
3439
3540func (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
5466func (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
7588func (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
7995func (m * defaultInterfaceMonitor ) checkUpdate () error {
0 commit comments