protect socket variable with mutex; fix #437

This commit is contained in:
Cenk Alti
2018-12-25 11:23:47 +03:00
parent fcbc168ae6
commit 1b7ce4c378
+15 -2
View File
@@ -49,6 +49,7 @@ func (cfg Config) LogFields() log.Fields {
// Frontend holds the state of a UDP BitTorrent Frontend.
type Frontend struct {
socket *net.UDPConn
m sync.Mutex
closing chan struct{}
wg sync.WaitGroup
@@ -103,10 +104,20 @@ func (t *Frontend) Stop() stop.Result {
c := make(stop.Channel)
go func() {
t.m.Lock()
defer t.m.Unlock()
close(t.closing)
t.socket.SetReadDeadline(time.Now())
if t.socket != nil {
t.socket.SetReadDeadline(time.Now())
}
t.wg.Wait()
c.Done(t.socket.Close())
var err error
if t.socket != nil {
err = t.socket.Close()
}
c.Done(err)
}()
return c.Result()
@@ -120,7 +131,9 @@ func (t *Frontend) listenAndServe() error {
return err
}
t.m.Lock()
t.socket, err = net.ListenUDP("udp", udpAddr)
t.m.Unlock()
if err != nil {
return err
}