Allow go routine to shutdown in darwin tun

This commit is contained in:
Jason A. Donenfeld 2018-05-14 04:14:57 +02:00
parent 5f5503afa8
commit b76ab82539

View file

@ -40,9 +40,9 @@ type NativeTun struct {
fd *os.File
rwcancel *rwcancel.RWCancel
mtu int
events chan TUNEvent
errors chan error
statusListenersShutdown chan struct{}
}
var sockaddrCtlSize uintptr = 32
@ -117,6 +117,7 @@ func CreateTUNFromFile(file *os.File) (TUNDevice, error) {
mtu: 1500,
events: make(chan TUNEvent, 10),
errors: make(chan error, 1),
statusListenersShutdown: make(chan struct{}, 0),
}
_, err := tun.Name()
@ -142,7 +143,7 @@ func CreateTUNFromFile(file *os.File) (TUNDevice, error) {
statusMTU int
)
for ; ; time.Sleep(time.Second) {
for {
intr, err := net.InterfaceByName(tun.name)
if err != nil {
tun.errors <- err
@ -164,6 +165,12 @@ func CreateTUNFromFile(file *os.File) (TUNDevice, error) {
tun.events <- TUNEventMTUUpdate
}
statusMTU = intr.MTU
select {
case <-time.After(time.Second / 10):
case <-tun.statusListenersShutdown:
return
}
}
}(tun)
@ -251,6 +258,7 @@ func (tun *NativeTun) Write(buff []byte, offset int) (int, error) {
}
func (tun *NativeTun) Close() error {
close(tun.statusListenersShutdown)
err1 := tun.rwcancel.Cancel()
err2 := tun.fd.Close()
close(tun.events)