forked from mirror/redcon
Add server.Addr() : returns server's listen address.
Useful to get actual listen address when we listen to random port (localhost:0). Also move the `s.ln=ln` assignment from `serve` to `ListenServeAndSignal` to avoid race condition.
This commit is contained in:
parent
b6e65d498d
commit
75d62f9c0b
20
redcon.go
20
redcon.go
|
@ -178,6 +178,11 @@ func (s *Server) ListenAndServe() error {
|
||||||
return s.ListenServeAndSignal(nil)
|
return s.ListenServeAndSignal(nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Addr returns server's listen address
|
||||||
|
func (s *Server) Addr() net.Addr {
|
||||||
|
return s.ln.Addr()
|
||||||
|
}
|
||||||
|
|
||||||
// Close stops listening on the TCP address.
|
// Close stops listening on the TCP address.
|
||||||
// Already Accepted connections will be closed.
|
// Already Accepted connections will be closed.
|
||||||
func (s *TLSServer) Close() error {
|
func (s *TLSServer) Close() error {
|
||||||
|
@ -247,10 +252,11 @@ func (s *Server) ListenServeAndSignal(signal chan error) error {
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
s.ln = ln
|
||||||
if signal != nil {
|
if signal != nil {
|
||||||
signal <- nil
|
signal <- nil
|
||||||
}
|
}
|
||||||
return serve(s, ln)
|
return serve(s)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListenServeAndSignal serves incoming connections and passes nil or error
|
// ListenServeAndSignal serves incoming connections and passes nil or error
|
||||||
|
@ -263,18 +269,16 @@ func (s *TLSServer) ListenServeAndSignal(signal chan error) error {
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
s.ln = ln
|
||||||
if signal != nil {
|
if signal != nil {
|
||||||
signal <- nil
|
signal <- nil
|
||||||
}
|
}
|
||||||
return serve(s.Server, ln)
|
return serve(s.Server)
|
||||||
}
|
}
|
||||||
|
|
||||||
func serve(s *Server, ln net.Listener) error {
|
func serve(s *Server) error {
|
||||||
s.mu.Lock()
|
|
||||||
s.ln = ln
|
|
||||||
s.mu.Unlock()
|
|
||||||
defer func() {
|
defer func() {
|
||||||
ln.Close()
|
s.ln.Close()
|
||||||
func() {
|
func() {
|
||||||
s.mu.Lock()
|
s.mu.Lock()
|
||||||
defer s.mu.Unlock()
|
defer s.mu.Unlock()
|
||||||
|
@ -285,7 +289,7 @@ func serve(s *Server, ln net.Listener) error {
|
||||||
}()
|
}()
|
||||||
}()
|
}()
|
||||||
for {
|
for {
|
||||||
lnconn, err := ln.Accept()
|
lnconn, err := s.ln.Accept()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.mu.Lock()
|
s.mu.Lock()
|
||||||
done := s.done
|
done := s.done
|
||||||
|
|
Loading…
Reference in New Issue