From 53000cf06e1640cff8b4f4e8f07f9bb2b5dff67b Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Mon, 22 Jul 2024 20:37:37 -0400 Subject: [PATCH] exit cleanly on eg, failure to bind socket --- P2P/Http/State.hs | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/P2P/Http/State.hs b/P2P/Http/State.hs index aaac3ee51e..f0d1b8e8bc 100644 --- a/P2P/Http/State.hs +++ b/P2P/Http/State.hs @@ -185,26 +185,35 @@ withLocalP2PConnections workerpool a = do myuuid <- getUUID reqv <- liftIO newEmptyTMVarIO relv <- liftIO newEmptyTMVarIO - asyncservicer <- liftIO $ async $ servicer myuuid reqv relv - a (acquireconn reqv) `finally` join (liftIO (wait asyncservicer)) + endv <- liftIO newEmptyTMVarIO + asyncservicer <- liftIO $ async $ servicer myuuid reqv relv endv + let endit = do + liftIO $ atomically $ putTMVar endv () + liftIO $ wait asyncservicer + a (acquireconn reqv) `finally` endit where acquireconn reqv connparams = do respvar <- newEmptyTMVarIO atomically $ putTMVar reqv (connparams, respvar) atomically $ takeTMVar respvar - servicer myuuid reqv relv = do + servicer myuuid reqv relv endv = do reqrel <- liftIO $ atomically $ (Right <$> takeTMVar reqv) `orElse` - (Left <$> takeTMVar relv) + (Left . Right <$> takeTMVar relv) + `orElse` + (Left . Left <$> takeTMVar endv) case reqrel of - Right (connparams, respvar) -> + Right (connparams, respvar) -> do servicereq myuuid relv connparams >>= atomically . putTMVar respvar - Left releaseconn -> releaseconn - servicer myuuid reqv relv + servicer myuuid reqv relv endv + Left (Right releaseconn) -> do + releaseconn + servicer myuuid reqv relv endv + Left (Left ()) -> return () servicereq myuuid relv connparams | connectionServerUUID connparams /= myuuid =