protect socket variable with mutex; fix #437
This commit is contained in:
parent
fcbc168ae6
commit
1b7ce4c378
1 changed files with 15 additions and 2 deletions
|
@ -49,6 +49,7 @@ func (cfg Config) LogFields() log.Fields {
|
||||||
// Frontend holds the state of a UDP BitTorrent Frontend.
|
// Frontend holds the state of a UDP BitTorrent Frontend.
|
||||||
type Frontend struct {
|
type Frontend struct {
|
||||||
socket *net.UDPConn
|
socket *net.UDPConn
|
||||||
|
m sync.Mutex
|
||||||
closing chan struct{}
|
closing chan struct{}
|
||||||
wg sync.WaitGroup
|
wg sync.WaitGroup
|
||||||
|
|
||||||
|
@ -103,10 +104,20 @@ func (t *Frontend) Stop() stop.Result {
|
||||||
|
|
||||||
c := make(stop.Channel)
|
c := make(stop.Channel)
|
||||||
go func() {
|
go func() {
|
||||||
|
t.m.Lock()
|
||||||
|
defer t.m.Unlock()
|
||||||
|
|
||||||
close(t.closing)
|
close(t.closing)
|
||||||
t.socket.SetReadDeadline(time.Now())
|
if t.socket != nil {
|
||||||
|
t.socket.SetReadDeadline(time.Now())
|
||||||
|
}
|
||||||
t.wg.Wait()
|
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()
|
return c.Result()
|
||||||
|
@ -120,7 +131,9 @@ func (t *Frontend) listenAndServe() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
t.m.Lock()
|
||||||
t.socket, err = net.ListenUDP("udp", udpAddr)
|
t.socket, err = net.ListenUDP("udp", udpAddr)
|
||||||
|
t.m.Unlock()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue