aboutsummaryrefslogtreecommitdiff
path: root/UUID.hs
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2010-10-31 01:51:50 -0400
committerGravatar Joey Hess <joey@kitenet.net>2010-10-31 01:51:50 -0400
commit6a9a9bd5a316f143964574e5ed12eb69b1d17c41 (patch)
treec48ac6876dc63fb97117c13fc654806a85185722 /UUID.hs
parent59672d32edd9cc30942a9200670b3e1f817d26aa (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.hs10
1 files changed, 6 insertions, 4 deletions
diff --git a/UUID.hs b/UUID.hs
index f2235e4b6..20f85bae1 100644
--- a/UUID.hs
+++ b/UUID.hs
@@ -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 =