From: Joey Hess Date: Wed, 20 Oct 2021 16:13:49 +0000 (-0400) Subject: improve with continuation X-Git-Tag: archive/raspbian/10.20250416-2+rpi1~1^2~79^2~119 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=c47794991cbc9f04bf4bab2bb51da5c1a33d23e2;p=git-annex.git improve with continuation no behavior change --- diff --git a/Database/Handle.hs b/Database/Handle.hs index 349dbca30d..b2ae6ed5a7 100644 --- a/Database/Handle.hs +++ b/Database/Handle.hs @@ -132,33 +132,29 @@ data Job | CloseJob workerThread :: T.Text -> TableName -> MVar Job -> IO () -workerThread db tablename jobs = go +workerThread db tablename jobs = newconn where - go = do + newconn = do v <- tryNonAsync (runSqliteRobustly tablename db loop) case v of Left e -> hPutStrLn stderr $ "sqlite worker thread crashed: " ++ show e - Right True -> go - Right False -> return () + Right cont -> cont - getjob :: IO (Either BlockedIndefinitelyOnMVar Job) - getjob = try $ takeMVar jobs - loop = do job <- liftIO getjob case job of -- Exception is thrown when the MVar is garbage -- collected, which means the whole DbHandle -- is not used any longer. Shutdown cleanly. - Left BlockedIndefinitelyOnMVar -> return False - Right CloseJob -> return False + Left BlockedIndefinitelyOnMVar -> return (return ()) + Right CloseJob -> return (return ()) Right (QueryJob a) -> a >> loop Right (ChangeJob a) -> do a -- Exit this sqlite connection so the -- database gets updated on disk. - return True + return newconn -- Change is run in a separate database connection -- since sqlite only supports a single writer at a -- time, and it may crash the database connection @@ -169,7 +165,10 @@ workerThread db tablename jobs = go -- change that was just written, using -- a different db handle, is immediately -- visible to queries. - return True + return newconn + + getjob :: IO (Either BlockedIndefinitelyOnMVar Job) + getjob = try $ takeMVar jobs -- Like runSqlite, but more robust. --