aboutsummaryrefslogtreecommitdiff
path: root/Utility/CoProcess.hs
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2014-01-01 21:42:25 -0400
committerGravatar Joey Hess <joey@kitenet.net>2014-01-01 21:42:25 -0400
commitae3837431df9404dc70e3a73855c25aa71d2b1de (patch)
tree9184429402aa6328bee3bc110c5985fc496daa42 /Utility/CoProcess.hs
parenta69a27588057600f304fff6eeb9cbb42bc9ebb36 (diff)
Avoid looping if long-running git cat-file or git hash-object crashes and keeps crashing when restarted.
Diffstat (limited to 'Utility/CoProcess.hs')
-rw-r--r--Utility/CoProcess.hs13
1 files changed, 7 insertions, 6 deletions
diff --git a/Utility/CoProcess.hs b/Utility/CoProcess.hs
index 710d2af13..c1134011b 100644
--- a/Utility/CoProcess.hs
+++ b/Utility/CoProcess.hs
@@ -30,15 +30,15 @@ data CoProcessState = CoProcessState
}
data CoProcessSpec = CoProcessSpec
- { coProcessRestartable :: Bool
+ { coProcessNumRestarts :: Int
, coProcessCmd :: FilePath
, coProcessParams :: [String]
, coProcessEnv :: Maybe [(String, String)]
}
-start :: Bool -> FilePath -> [String] -> Maybe [(String, String)] -> IO CoProcessHandle
-start restartable cmd params env = do
- s <- start' $ CoProcessSpec restartable cmd params env
+start :: Int -> FilePath -> [String] -> Maybe [(String, String)] -> IO CoProcessHandle
+start numrestarts cmd params env = do
+ s <- start' $ CoProcessSpec numrestarts cmd params env
newMVar s
start' :: CoProcessSpec -> IO CoProcessState
@@ -66,7 +66,7 @@ query ch send receive = do
return
where
restartable s a cont
- | coProcessRestartable (coProcessSpec s) =
+ | coProcessNumRestarts (coProcessSpec s) > 0 =
maybe restart cont =<< catchMaybeIO a
| otherwise = cont =<< a
restart = do
@@ -75,7 +75,8 @@ query ch send receive = do
hClose $ coProcessTo s
hClose $ coProcessFrom s
void $ waitForProcess $ coProcessPid s
- s' <- start' (coProcessSpec s)
+ s' <- start' $ (coProcessSpec s)
+ { coProcessNumRestarts = coProcessNumRestarts (coProcessSpec s) - 1 }
putMVar ch s'
query ch send receive