Fixed read from closed channel
A premature waitgroup .Done resulted in reading from closed channel. This caused a nil-pointer deref & crash. Added additional debugging when closing routines.
This commit is contained in:
parent
26a56a652e
commit
ac9912345b
2
peer.go
2
peer.go
|
@ -246,8 +246,8 @@ func (peer *Peer) Stop() {
|
||||||
|
|
||||||
// stop & wait for ongoing peer routines
|
// stop & wait for ongoing peer routines
|
||||||
|
|
||||||
peer.routines.stop.Broadcast()
|
|
||||||
peer.routines.starting.Wait()
|
peer.routines.starting.Wait()
|
||||||
|
peer.routines.stop.Broadcast()
|
||||||
peer.routines.stopping.Wait()
|
peer.routines.stopping.Wait()
|
||||||
|
|
||||||
// stop timers
|
// stop timers
|
||||||
|
|
10
receive.go
10
receive.go
|
@ -500,8 +500,8 @@ func (peer *Peer) RoutineSequentialReceiver() {
|
||||||
logError := device.log.Error
|
logError := device.log.Error
|
||||||
logDebug := device.log.Debug
|
logDebug := device.log.Debug
|
||||||
|
|
||||||
func() {
|
defer func() {
|
||||||
defer peer.routines.stopping.Done()
|
peer.routines.stopping.Done()
|
||||||
logDebug.Println(peer.String(), ": Routine, Sequential Receiver, Stopped")
|
logDebug.Println(peer.String(), ": Routine, Sequential Receiver, Stopped")
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
@ -516,7 +516,11 @@ func (peer *Peer) RoutineSequentialReceiver() {
|
||||||
case <-peer.routines.stop.Wait():
|
case <-peer.routines.stop.Wait():
|
||||||
return
|
return
|
||||||
|
|
||||||
case elem := <-peer.queue.inbound:
|
case elem, ok := <-peer.queue.inbound:
|
||||||
|
|
||||||
|
if !ok {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// wait for decryption
|
// wait for decryption
|
||||||
|
|
||||||
|
|
14
send.go
14
send.go
|
@ -320,13 +320,16 @@ func (device *Device) RoutineEncryption() {
|
||||||
*/
|
*/
|
||||||
func (peer *Peer) RoutineSequentialSender() {
|
func (peer *Peer) RoutineSequentialSender() {
|
||||||
|
|
||||||
defer peer.routines.stopping.Done()
|
|
||||||
|
|
||||||
device := peer.device
|
device := peer.device
|
||||||
|
|
||||||
logDebug := device.log.Debug
|
logDebug := device.log.Debug
|
||||||
logDebug.Println("Routine, sequential sender, started for", peer.String())
|
logDebug.Println("Routine, sequential sender, started for", peer.String())
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
peer.routines.stopping.Done()
|
||||||
|
logDebug.Println(peer.String(), ": Routine, Sequential sender, Stopped")
|
||||||
|
}()
|
||||||
|
|
||||||
peer.routines.starting.Done()
|
peer.routines.starting.Done()
|
||||||
|
|
||||||
for {
|
for {
|
||||||
|
@ -337,7 +340,12 @@ func (peer *Peer) RoutineSequentialSender() {
|
||||||
"Routine, sequential sender, stopped for", peer.String())
|
"Routine, sequential sender, stopped for", peer.String())
|
||||||
return
|
return
|
||||||
|
|
||||||
case elem := <-peer.queue.outbound:
|
case elem, ok := <-peer.queue.outbound:
|
||||||
|
|
||||||
|
if !ok {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
elem.mutex.Lock()
|
elem.mutex.Lock()
|
||||||
if elem.IsDropped() {
|
if elem.IsDropped() {
|
||||||
continue
|
continue
|
||||||
|
|
10
timers.go
10
timers.go
|
@ -183,13 +183,15 @@ func (peer *Peer) sendNewHandshake() error {
|
||||||
|
|
||||||
func (peer *Peer) RoutineTimerHandler() {
|
func (peer *Peer) RoutineTimerHandler() {
|
||||||
|
|
||||||
defer peer.routines.stopping.Done()
|
|
||||||
|
|
||||||
device := peer.device
|
device := peer.device
|
||||||
|
|
||||||
logInfo := device.log.Info
|
logInfo := device.log.Info
|
||||||
logDebug := device.log.Debug
|
logDebug := device.log.Debug
|
||||||
logDebug.Println("Routine, timer handler, started for peer", peer.String())
|
|
||||||
|
defer func() {
|
||||||
|
logDebug.Println(peer.String(), ": Routine, Timer handler, Stopped")
|
||||||
|
peer.routines.stopping.Done()
|
||||||
|
}()
|
||||||
|
|
||||||
// reset all timers
|
// reset all timers
|
||||||
|
|
||||||
|
@ -205,6 +207,8 @@ func (peer *Peer) RoutineTimerHandler() {
|
||||||
peer.timer.keepalivePersistent.Reset(duration)
|
peer.timer.keepalivePersistent.Reset(duration)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logDebug.Println("Routine, timer handler, started for peer", peer.String())
|
||||||
|
|
||||||
// signal synchronised setup complete
|
// signal synchronised setup complete
|
||||||
|
|
||||||
peer.routines.starting.Done()
|
peer.routines.starting.Done()
|
||||||
|
|
Loading…
Reference in a new issue