From 4d9846482d41f579d1631623d931d2c699309446 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Fri, 3 Nov 2017 17:49:28 +0700 Subject: [PATCH] improve closing of the server Closing the sessions can be done concurrently. --- server.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/server.go b/server.go index 22b07575..39c43167 100644 --- a/server.go +++ b/server.go @@ -190,14 +190,19 @@ func (s *server) Accept() (Session, error) { // Close the server func (s *server) Close() error { s.sessionsMutex.Lock() + var wg sync.WaitGroup for _, session := range s.sessions { if session != nil { - s.sessionsMutex.Unlock() - _ = session.Close(nil) - s.sessionsMutex.Lock() + wg.Add(1) + go func() { + // session.Close() blocks until the CONNECTION_CLOSE has been sent and the run-loop has stopped + _ = session.Close(nil) + wg.Done() + }() } } s.sessionsMutex.Unlock() + wg.Wait() if s.conn == nil { return nil @@ -310,7 +315,7 @@ func (s *server) handlePacket(pconn net.PacketConn, remoteAddr net.Addr, packet go func() { // session.run() returns as soon as the session is closed _ = session.run() - s.removeConnection(hdr.ConnectionID) + s.removeConnection(connID) }() go func() {