Simplify unlocking dance in *Serve functions (#719)
This commit is contained in:
parent
21d95e19e6
commit
208cd1e89e
43
server.go
43
server.go
|
@ -367,10 +367,17 @@ func (srv *Server) spawnWorker(w *response) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func unlockOnce(l sync.Locker) func() {
|
||||||
|
var once sync.Once
|
||||||
|
return func() { once.Do(l.Unlock) }
|
||||||
|
}
|
||||||
|
|
||||||
// ListenAndServe starts a nameserver on the configured address in *Server.
|
// ListenAndServe starts a nameserver on the configured address in *Server.
|
||||||
func (srv *Server) ListenAndServe() error {
|
func (srv *Server) ListenAndServe() error {
|
||||||
|
unlock := unlockOnce(&srv.lock)
|
||||||
srv.lock.Lock()
|
srv.lock.Lock()
|
||||||
defer srv.lock.Unlock()
|
defer unlock()
|
||||||
|
|
||||||
if srv.started {
|
if srv.started {
|
||||||
return &Error{err: "server already started"}
|
return &Error{err: "server already started"}
|
||||||
}
|
}
|
||||||
|
@ -396,10 +403,8 @@ func (srv *Server) ListenAndServe() error {
|
||||||
}
|
}
|
||||||
srv.Listener = l
|
srv.Listener = l
|
||||||
srv.started = true
|
srv.started = true
|
||||||
srv.lock.Unlock()
|
unlock()
|
||||||
err = srv.serveTCP(l)
|
return srv.serveTCP(l)
|
||||||
srv.lock.Lock() // to satisfy the defer at the top
|
|
||||||
return err
|
|
||||||
case "tcp-tls", "tcp4-tls", "tcp6-tls":
|
case "tcp-tls", "tcp4-tls", "tcp6-tls":
|
||||||
network := "tcp"
|
network := "tcp"
|
||||||
if srv.Net == "tcp4-tls" {
|
if srv.Net == "tcp4-tls" {
|
||||||
|
@ -414,10 +419,8 @@ func (srv *Server) ListenAndServe() error {
|
||||||
}
|
}
|
||||||
srv.Listener = l
|
srv.Listener = l
|
||||||
srv.started = true
|
srv.started = true
|
||||||
srv.lock.Unlock()
|
unlock()
|
||||||
err = srv.serveTCP(l)
|
return srv.serveTCP(l)
|
||||||
srv.lock.Lock() // to satisfy the defer at the top
|
|
||||||
return err
|
|
||||||
case "udp", "udp4", "udp6":
|
case "udp", "udp4", "udp6":
|
||||||
a, err := net.ResolveUDPAddr(srv.Net, addr)
|
a, err := net.ResolveUDPAddr(srv.Net, addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -432,10 +435,8 @@ func (srv *Server) ListenAndServe() error {
|
||||||
}
|
}
|
||||||
srv.PacketConn = l
|
srv.PacketConn = l
|
||||||
srv.started = true
|
srv.started = true
|
||||||
srv.lock.Unlock()
|
unlock()
|
||||||
err = srv.serveUDP(l)
|
return srv.serveUDP(l)
|
||||||
srv.lock.Lock() // to satisfy the defer at the top
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
return &Error{err: "bad network"}
|
return &Error{err: "bad network"}
|
||||||
}
|
}
|
||||||
|
@ -443,8 +444,10 @@ func (srv *Server) ListenAndServe() error {
|
||||||
// ActivateAndServe starts a nameserver with the PacketConn or Listener
|
// ActivateAndServe starts a nameserver with the PacketConn or Listener
|
||||||
// configured in *Server. Its main use is to start a server from systemd.
|
// configured in *Server. Its main use is to start a server from systemd.
|
||||||
func (srv *Server) ActivateAndServe() error {
|
func (srv *Server) ActivateAndServe() error {
|
||||||
|
unlock := unlockOnce(&srv.lock)
|
||||||
srv.lock.Lock()
|
srv.lock.Lock()
|
||||||
defer srv.lock.Unlock()
|
defer unlock()
|
||||||
|
|
||||||
if srv.started {
|
if srv.started {
|
||||||
return &Error{err: "server already started"}
|
return &Error{err: "server already started"}
|
||||||
}
|
}
|
||||||
|
@ -464,18 +467,14 @@ func (srv *Server) ActivateAndServe() error {
|
||||||
return e
|
return e
|
||||||
}
|
}
|
||||||
srv.started = true
|
srv.started = true
|
||||||
srv.lock.Unlock()
|
unlock()
|
||||||
e := srv.serveUDP(t)
|
return srv.serveUDP(t)
|
||||||
srv.lock.Lock() // to satisfy the defer at the top
|
|
||||||
return e
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if l != nil {
|
if l != nil {
|
||||||
srv.started = true
|
srv.started = true
|
||||||
srv.lock.Unlock()
|
unlock()
|
||||||
e := srv.serveTCP(l)
|
return srv.serveTCP(l)
|
||||||
srv.lock.Lock() // to satisfy the defer at the top
|
|
||||||
return e
|
|
||||||
}
|
}
|
||||||
return &Error{err: "bad listeners"}
|
return &Error{err: "bad listeners"}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue