diff options
| author | Roman Smrž <roman.smrz@seznam.cz> | 2026-08-22 13:24:23 +0200 |
|---|---|---|
| committer | Roman Smrž <roman.smrz@seznam.cz> | 2026-08-23 22:10:06 +0200 |
| commit | f2824ef200d165db41a0ff2d644264970c5778dc (patch) | |
| tree | 01fb4b8f74aa34029f9f1470ea612dfb51c4f02a /src | |
| parent | 1256ce3e896b359de0ff95069e3a977cf515dc61 (diff) | |
Return from startServer only after initializing the socket
Diffstat (limited to 'src')
| -rw-r--r-- | src/Erebos/Network.hs | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/src/Erebos/Network.hs b/src/Erebos/Network.hs index 2f3b278..225ba4a 100644 --- a/src/Erebos/Network.hs +++ b/src/Erebos/Network.hs @@ -449,16 +449,16 @@ startServer serverOptions serverOrigHead logd' serverServices = do erebosNetworkProtocol (headLocalIdentity serverOrigHead) logd logt protocolRawPath protocolControlFlow - forkServerThread server "main-loop" $ withSocketsDo $ do + withSocketsDo $ do let hints = defaultHints - { addrFlags = [AI_PASSIVE] + { addrFlags = [ AI_PASSIVE ] , addrFamily = AF_INET6 , addrSocketType = Datagram } addr:_ <- getAddrInfo (Just hints) Nothing (Just $ show $ serverPort serverOptions) let open = socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr) closeAndNotify sock = close sock >> putMVar serverSocketClosed () - bracket open closeAndNotify $ \sock -> do + bracketOnError open closeAndNotify $ \sock -> do withFdSocket sock setCloseOnExecIfNeeded setSocketOption sock Broadcast 1 bind sock (addrAddress addr) `catchIOError` \e -> if @@ -470,7 +470,8 @@ startServer serverOptions serverOrigHead logd' serverServices = do bind sock (SockAddrInet6 0 f h s) | otherwise -> ioError e putMVar serverSocket sock - loop sock + forkServerThread server "main-loop" $ do + loop sock `finally` closeAndNotify sock forkServerThread server "service-handler" $ forever $ do ( peer, paddr, svc, ref, streams ) <- atomically $ readTQueue chanSvc |