diff --git a/server/server.go b/server/server.go index e930eb0..3c40ba0 100644 --- a/server/server.go +++ b/server/server.go @@ -3,11 +3,13 @@ package server import ( "net" "strconv" + "sync" ) type Server struct { listeners []*Listener closeChannel chan int + stopOnce sync.Once } type ConnectionType string @@ -32,12 +34,14 @@ func NewServer(listeners []*Listener) *Server { return &Server{ listeners: listeners, closeChannel: make(chan int), + stopOnce: sync.Once{}, } } func (s *Server) Stop() { - s.closeChannel <- 0 - close(s.closeChannel) + s.stopOnce.Do(func() { + close(s.closeChannel) + }) } func (s *Server) Start() { diff --git a/server/server_test.go b/server/server_test.go new file mode 100644 index 0000000..f92539d --- /dev/null +++ b/server/server_test.go @@ -0,0 +1,15 @@ +package server + +import "testing" + +func TestServerStopIdempotent(t *testing.T) { + s := NewServer([]*Listener{}) + // call Stop multiple times; should not panic + s.Stop() + defer func() { + if r := recover(); r != nil { + t.Fatalf("Stop panicked on second call: %v", r) + } + }() + s.Stop() +}