From dd4058140d7e79d386ca8d5d9d20c70ac485331a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Na=C3=AFm=20Favier?= Date: Sat, 18 Feb 2023 23:47:24 +0100 Subject: [PATCH] Throw exceptions from threads `forkFinally` catches exceptions so we need to re-throw them after cleaning up so that they show up in stderr. --- Network/IRC/Client/Utils.hs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Network/IRC/Client/Utils.hs b/Network/IRC/Client/Utils.hs index f9833c7..ceff2ef 100644 --- a/Network/IRC/Client/Utils.hs +++ b/Network/IRC/Client/Utils.hs @@ -43,6 +43,7 @@ module Network.IRC.Client.Utils import Control.Concurrent (ThreadId, forkFinally, myThreadId) import Control.Concurrent.STM (STM, TVar, atomically, modifyTVar) +import Control.Exception (throwIO) import Control.Monad.IO.Class (liftIO) import qualified Data.Set as S import Data.Text (Text) @@ -149,8 +150,9 @@ fork :: IRC s () -> IRC s ThreadId fork ma = do s <- getIRCState liftIO $ do - tid <- forkFinally (runIRCAction ma s) $ \_ -> do + tid <- forkFinally (runIRCAction ma s) $ \res -> do tid <- myThreadId atomically $ modifyTVar (_runningThreads s) (S.delete tid) + either throwIO pure res atomically $ modifyTVar (_runningThreads s) (S.insert tid) pure tid