Fix deadlock when reconfiguring multicast

This commit is contained in:
Neil Alexander 2019-03-04 23:16:46 +00:00
parent 88925d3e06
commit 2ef823e69c
No known key found for this signature in database
GPG Key ID: A02A2019A2BB0944
2 changed files with 11 additions and 6 deletions

View File

@ -76,14 +76,17 @@ func (l *link) init(c *Core) error {
go func() {
for {
e := <-l.reconfigure
response := make(chan error)
l.tcp.reconfigure <- response
if err := <-response; err != nil {
tcpresponse := make(chan error)
awdlresponse := make(chan error)
l.tcp.reconfigure <- tcpresponse
if err := <-tcpresponse; err != nil {
e <- err
continue
}
l.awdl.reconfigure <- response
if err := <-response; err != nil {
l.awdl.reconfigure <- awdlresponse
if err := <-awdlresponse; err != nil {
e <- err
continue
}
e <- nil
}

View File

@ -16,6 +16,7 @@ package yggdrasil
import (
"context"
"errors"
"fmt"
"math/rand"
"net"
@ -57,10 +58,10 @@ func (t *tcp) getAddr() *net.TCPAddr {
// to multicast.go, which obviously is not great, but right now multicast.go
// doesn't have the ability to send more than one address in a packet either
t.mutex.Lock()
defer t.mutex.Unlock()
for _, listener := range t.listeners {
return listener.Addr().(*net.TCPAddr)
}
t.mutex.Unlock()
return nil
}
@ -85,6 +86,7 @@ func (t *tcp) init(l *link) error {
if len(added) > 0 || len(deleted) > 0 {
for _, add := range added {
if add[:6] != "tcp://" {
e <- errors.New("unknown scheme: " + add)
continue
}
if err := t.listen(add[6:]); err != nil {