diff options
author | Joey Hess <joey@kitenet.net> | 2010-10-31 01:51:50 -0400 |
---|---|---|
committer | Joey Hess <joey@kitenet.net> | 2010-10-31 01:51:50 -0400 |
commit | 6a9a9bd5a316f143964574e5ed12eb69b1d17c41 (patch) | |
tree | c48ac6876dc63fb97117c13fc654806a85185722 /UUID.hs | |
parent | 59672d32edd9cc30942a9200670b3e1f817d26aa (diff) |
another memory optimisation
This time memory leaked if lots of UUIDs needed to be pretty-printed, as in
a get or drop of many files. Essentially the same strict read buffering
problem that affected the LocationLog underneath though.
uuidMap really could stand to be cached, as the uuid log is read many times
in this case. But it is a fairly edge case.
Diffstat (limited to 'UUID.hs')
-rw-r--r-- | UUID.hs | 10 |
1 files changed, 6 insertions, 4 deletions
@@ -26,6 +26,7 @@ import System.Cmd.Utils import System.IO import System.Directory import qualified Data.Map as M +import System.Posix.Process import qualified GitRepo as Git import Types @@ -111,8 +112,11 @@ describeUUID uuid desc = do m <- uuidMap let m' = M.insert uuid desc m log <- uuidLog + pid <- liftIO $ getProcessID + let tmplog = log ++ ".tmp" ++ show pid liftIO $ createDirectoryIfMissing True (parentDir log) - liftIO $ withFileLocked log WriteMode (\h -> hPutStr h $ serialize m') + liftIO $ writeFile tmplog $ serialize m' + liftIO $ renameFile tmplog log where serialize m = unlines $ map (\(u, d) -> u++" "++d) $ M.toList m @@ -120,9 +124,7 @@ describeUUID uuid desc = do uuidMap :: Annex (M.Map UUID String) uuidMap = do log <- uuidLog - s <- liftIO $ catch - (withFileLocked log ReadMode $ \h -> hGetContentsStrict h) - (\error -> return "") + s <- liftIO $ catch (readFile log) (\error -> return "") return $ M.fromList $ map (\l -> pair l) $ lines s where pair l = |