Give bind its own wait group

In a waitgroup, all waits must come after all adds
This commit is contained in:
Jason A. Donenfeld 2018-05-20 06:19:29 +02:00
parent 5e924e5407
commit 1068d6b92b
3 changed files with 8 additions and 4 deletions

View File

@ -75,6 +75,7 @@ func unsafeCloseBind(device *Device) error {
err = netc.bind.Close()
netc.bind = nil
}
netc.stopping.Wait()
return err
}
@ -162,10 +163,11 @@ func (device *Device) BindUpdate() error {
// start receiving routines
device.state.starting.Add(ConnRoutineNumber)
device.state.stopping.Add(ConnRoutineNumber)
device.net.starting.Add(ConnRoutineNumber)
device.net.stopping.Add(ConnRoutineNumber)
go device.RoutineReceiveIncoming(ipv4.Version, netc.bind)
go device.RoutineReceiveIncoming(ipv6.Version, netc.bind)
device.net.starting.Wait()
device.log.Debug.Println("UDP bind has been updated")
}

View File

@ -35,6 +35,8 @@ type Device struct {
}
net struct {
starting sync.WaitGroup
stopping sync.WaitGroup
mutex sync.RWMutex
bind Bind // bind interface
port uint16 // listening port

View File

@ -125,11 +125,11 @@ func (device *Device) RoutineReceiveIncoming(IP int, bind Bind) {
logDebug := device.log.Debug
defer func() {
logDebug.Println("Routine: receive incoming IPv" + strconv.Itoa(IP) + " - stopped")
device.state.stopping.Done()
device.net.stopping.Done()
}()
logDebug.Println("Routine: receive incoming IPv" + strconv.Itoa(IP) + " - starting")
device.state.starting.Done()
device.net.starting.Done()
// receive datagrams until conn is closed