fix some data races in Server

This avoids some issues with Server.PacketConn and Server.Listener being
accessed outside of their locks.

Fixes #244.
This commit is contained in:
Jeff Hodges 2015-08-11 16:57:52 -07:00
parent c2d94895af
commit 1cb2437ad1
1 changed files with 10 additions and 6 deletions

View File

@ -288,7 +288,6 @@ func (srv *Server) ListenAndServe() error {
}
srv.stopUDP, srv.stopTCP = make(chan bool), make(chan bool)
srv.started = true
srv.lock.Unlock()
addr := srv.Addr
if addr == "" {
addr = ":domain"
@ -307,6 +306,7 @@ func (srv *Server) ListenAndServe() error {
return e
}
srv.Listener = l
srv.lock.Unlock()
return srv.serveTCP(l)
case "udp", "udp4", "udp6":
a, e := net.ResolveUDPAddr(srv.Net, addr)
@ -321,8 +321,10 @@ func (srv *Server) ListenAndServe() error {
return e
}
srv.PacketConn = l
srv.lock.Unlock()
return srv.serveUDP(l)
}
srv.lock.Unlock()
return &Error{err: "bad network"}
}
@ -336,20 +338,22 @@ func (srv *Server) ActivateAndServe() error {
}
srv.stopUDP, srv.stopTCP = make(chan bool), make(chan bool)
srv.started = true
pConn := srv.PacketConn
l := srv.Listener
srv.lock.Unlock()
if srv.PacketConn != nil {
if pConn != nil {
if srv.UDPSize == 0 {
srv.UDPSize = MinMsgSize
}
if t, ok := srv.PacketConn.(*net.UDPConn); ok {
if t, ok := pConn.(*net.UDPConn); ok {
if e := setUDPSocketOptions(t); e != nil {
return e
}
return srv.serveUDP(t)
}
}
if srv.Listener != nil {
if t, ok := srv.Listener.(*net.TCPListener); ok {
if l != nil {
if t, ok := l.(*net.TCPListener); ok {
return srv.serveTCP(t)
}
}
@ -367,7 +371,6 @@ func (srv *Server) Shutdown() error {
return &Error{err: "server not started"}
}
srv.started = false
srv.lock.Unlock()
net, addr := srv.Net, srv.Addr
switch {
case srv.Listener != nil:
@ -377,6 +380,7 @@ func (srv *Server) Shutdown() error {
a := srv.PacketConn.LocalAddr()
net, addr = a.Network(), a.String()
}
srv.lock.Unlock()
fin := make(chan bool)
switch net {