@@ -49,7 +49,7 @@ import Network.Socket
4949import qualified Network.TLS as T
5050import Simplex.Messaging.Transport
5151import Simplex.Messaging.Transport.Shared
52- import Simplex.Messaging.Util (catchAll_ , labelMyThread , tshow )
52+ import Simplex.Messaging.Util (catchAll_ , labelMyThread , tshow , unlessM )
5353import System.Exit (exitFailure )
5454import System.IO.Error (tryIOError )
5555import System.Mem.Weak (Weak , deRefWeak )
@@ -172,12 +172,13 @@ runTCPServerSocket (accepted, gracefullyClosed, clients) started getSocket serve
172172 E. bracket getSocket (closeServer started clients) $ \ sock ->
173173 forever . E. bracketOnError (safeAccept sock) (close . fst ) $ \ (conn, _peer) -> do
174174 cId <- atomically $ stateTVar accepted $ \ cId -> let cId' = cId + 1 in cId' `seq` (cId', cId')
175+ closed <- newTVarIO False
175176 let closeConn _ = do
176- atomically $ modifyTVar' clients $ IM. delete cId
177+ atomically $ writeTVar closed True >> modifyTVar' clients ( IM. delete cId)
177178 gracefulClose conn 5000 `catchAll_` pure () -- catchAll_ is needed here in case the connection was closed earlier
178179 atomically $ modifyTVar' gracefullyClosed (+ 1 )
179180 tId <- mkWeakThreadId =<< server conn `forkFinally` closeConn
180- atomically $ modifyTVar' clients $ IM. insert cId tId
181+ atomically $ unlessM (readTVar closed) $ modifyTVar' clients $ IM. insert cId tId
181182
182183-- | Recover from errors in `accept` whenever it is safe.
183184-- Some errors are safe to ignore, while blindly restaring `accept` may trigger a busy loop.
0 commit comments