diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2018-05-20 06:19:29 +0200 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2018-05-20 06:29:21 +0200 |
commit | 1068d6b92b905adef34525fbac37a5af7290f4fa (patch) | |
tree | 489aecd3861ff1592d358c8787084e1b89fee036 | |
parent | 5e924e540764ec64cdf19f9b146a3c398da4d240 (diff) |
Give bind its own wait group
In a waitgroup, all waits must come after all adds
-rw-r--r-- | conn.go | 6 | ||||
-rw-r--r-- | device.go | 2 | ||||
-rw-r--r-- | receive.go | 4 |
3 files changed, 8 insertions, 4 deletions
@@ -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") } @@ -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 @@ -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 |