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

View file

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

View file

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