summaryrefslogtreecommitdiff
path: root/src/Erebos/Network.hs
diff options
context:
space:
mode:
authorRoman Smrž <roman.smrz@seznam.cz>2025-06-13 22:49:29 +0200
committerRoman Smrž <roman.smrz@seznam.cz>2025-06-14 15:45:27 +0200
commit5b3c52c50b5301d009fb9a0d44b4cf91d50f6de4 (patch)
tree4814de0d56b7fe84da2ce507d24cfdf8e100f61e /src/Erebos/Network.hs
parent7fa7cdeb5a8c0c784145df852da8ec4c18cb6e6b (diff)
Terminate ICE thread when server is stoppedrelease-0.1
Changelog: Improved handling of ICE connections
Diffstat (limited to 'src/Erebos/Network.hs')
-rw-r--r--src/Erebos/Network.hs17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/Erebos/Network.hs b/src/Erebos/Network.hs
index 32d06f2..ed68ed4 100644
--- a/src/Erebos/Network.hs
+++ b/src/Erebos/Network.hs
@@ -392,8 +392,21 @@ startServer serverOptions serverOrigHead logd' serverServices = do
return server
stopServer :: Server -> IO ()
-stopServer Server {..} = do
- mapM_ killThread =<< takeMVar serverThreads
+stopServer server@Server {..} = do
+ withMVar serverPeers $ \peers -> do
+ ( global, peerStates ) <- atomically $ (,)
+ <$> takeTMVar serverServiceStates
+ <*> (forM (M.elems peers) $ \p@Peer {..} -> ( p, ) <$> takeTMVar peerServiceState)
+
+ forM_ global $ \(SomeServiceGlobalState (proxy :: Proxy s) gs) -> do
+ ps <- forM peerStates $ \( peer, states ) ->
+ return $ ( peer, ) $ case M.lookup (serviceID proxy) states of
+ Just (SomeServiceState (_ :: Proxy ps) pstate)
+ | Just (Refl :: s :~: ps) <- eqT
+ -> pstate
+ _ -> emptyServiceState proxy
+ serviceStopServer proxy server gs ps
+ mapM_ killThread =<< takeMVar serverThreads
dataResponseWorker :: Server -> IO ()
dataResponseWorker server = forever $ do