Smoother netlink shutdown
This commit is contained in:
parent
c1e097d6d0
commit
f738c45a68
23
tun_linux.go
23
tun_linux.go
@ -39,7 +39,7 @@ type NativeTun struct {
|
||||
nopi bool // the device was pased IFF_NO_PI
|
||||
rwcancel *rwcancel.RWCancel
|
||||
netlinkSock int
|
||||
shutdownHackListener chan struct{}
|
||||
statusListenersShutdown chan struct{}
|
||||
}
|
||||
|
||||
func (tun *NativeTun) File() *os.File {
|
||||
@ -63,7 +63,7 @@ func (tun *NativeTun) RoutineHackListener() {
|
||||
}
|
||||
select {
|
||||
case <-time.After(time.Second / 10):
|
||||
case <-tun.shutdownHackListener:
|
||||
case <-tun.statusListenersShutdown:
|
||||
return
|
||||
}
|
||||
}
|
||||
@ -94,6 +94,12 @@ func (tun *NativeTun) RoutineNetlinkListener() {
|
||||
return
|
||||
}
|
||||
|
||||
select {
|
||||
case <-tun.statusListenersShutdown:
|
||||
return
|
||||
default:
|
||||
}
|
||||
|
||||
for remain := msg[:msgn]; len(remain) >= unix.SizeofNlMsghdr; {
|
||||
|
||||
hdr := *(*unix.NlMsghdr)(unsafe.Pointer(&remain[0]))
|
||||
@ -328,17 +334,20 @@ func (tun *NativeTun) Events() chan TUNEvent {
|
||||
}
|
||||
|
||||
func (tun *NativeTun) Close() error {
|
||||
err1 := tun.fd.Close()
|
||||
err2 := closeUnblock(tun.netlinkSock)
|
||||
tun.rwcancel.Cancel()
|
||||
close(tun.statusListenersShutdown)
|
||||
err1 := closeUnblock(tun.netlinkSock)
|
||||
err2 := tun.fd.Close()
|
||||
err3 := tun.rwcancel.Cancel()
|
||||
close(tun.events)
|
||||
close(tun.shutdownHackListener)
|
||||
|
||||
if err1 != nil {
|
||||
return err1
|
||||
}
|
||||
if err2 != nil {
|
||||
return err2
|
||||
}
|
||||
return err3
|
||||
}
|
||||
|
||||
func CreateTUN(name string) (TUNDevice, error) {
|
||||
|
||||
@ -390,7 +399,7 @@ func CreateTUNFromFile(fd *os.File) (TUNDevice, error) {
|
||||
fd: fd,
|
||||
events: make(chan TUNEvent, 5),
|
||||
errors: make(chan error, 5),
|
||||
shutdownHackListener: make(chan struct{}, 0),
|
||||
statusListenersShutdown: make(chan struct{}, 0),
|
||||
nopi: false,
|
||||
}
|
||||
var err error
|
||||
|
Loading…
Reference in New Issue
Block a user