From 254f6a9a733736781dd7f292043f05b6957deb81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Gr=C3=B6ber?= Date: Mon, 4 Jan 2016 06:02:30 +0100 Subject: [PATCH] Get rid of landmine --- Language/Haskell/GhcMod/Find.hs | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/Language/Haskell/GhcMod/Find.hs b/Language/Haskell/GhcMod/Find.hs index 5723a65..382bb08 100644 --- a/Language/Haskell/GhcMod/Find.hs +++ b/Language/Haskell/GhcMod/Find.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE CPP, BangPatterns, DoAndIfThenElse, MultiWayIf #-} +{-# LANGUAGE CPP, BangPatterns, DoAndIfThenElse #-} module Language.Haskell.GhcMod.Find #ifndef SPEC @@ -176,17 +176,18 @@ newAsyncSymbolDb tmpdir = do return $ AsyncSymbolDb tmpdir mv getAsyncSymbolDb :: forall m. IOish m => AsyncSymbolDb -> GhcModT m SymbolDb -getAsyncSymbolDb (AsyncSymbolDb tmpdir mv) = go 0 +getAsyncSymbolDb (AsyncSymbolDb tmpdir mv) = do + db <- liftIO $ handleEx <$> takeMVar mv + outdated <- isOutdated db + if outdated + then do + asyncLoadSymbolDb tmpdir mv + liftIO $ handleEx <$> readMVar mv + else do + liftIO $ putMVar mv $ Right db + return db where - go :: Integer -> GhcModT m SymbolDb - go i = do - edb <- liftIO $ takeMVar mv + handleEx edb = case edb of Left ex -> throw ex - Right db -> do - outdated <- isOutdated db - if | i > 2 -> error "getAsyncSymbolDb: outdated loop" - | outdated -> asyncLoadSymbolDb tmpdir mv >> go (i + 1) - | otherwise -> do - liftIO $ putMVar mv (Right db) - return db + Right db -> db