diff options
author | Joey Hess <joeyh@joeyh.name> | 2016-09-08 13:17:43 -0400 |
---|---|---|
committer | Joey Hess <joeyh@joeyh.name> | 2016-09-08 13:17:43 -0400 |
commit | 70aaaf8eff6b8c9bb5ec033e9f17cc0cbd57b759 (patch) | |
tree | 46d719a4f1444c82e7850b48fef21438485e051d /Utility | |
parent | 3ac72528bd99b7257ff98fc6b988c5ef0f9e685a (diff) |
Rate limit console progress display updates to 10 per second. Was updating as frequently as changes were reported, up to hundreds of times per second, which used unncessary bandwidth when running git-annex over ssh etc.
Diffstat (limited to 'Utility')
-rw-r--r-- | Utility/Metered.hs | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/Utility/Metered.hs b/Utility/Metered.hs index da83fd8cd..440aa3f07 100644 --- a/Utility/Metered.hs +++ b/Utility/Metered.hs @@ -1,6 +1,6 @@ {- Metered IO and actions - - - Copyright 2012-2105 Joey Hess <id@joeyh.name> + - Copyright 2012-2106 Joey Hess <id@joeyh.name> - - License: BSD-2-clause -} @@ -21,6 +21,8 @@ import Data.Bits.Utils import Control.Concurrent import Control.Concurrent.Async import Control.Monad.IO.Class (MonadIO) +import Data.Time.Clock +import Data.Time.Clock.POSIX {- An action that can be run repeatedly, updating it on the bytes processed. - @@ -259,3 +261,24 @@ outputFilter cmd params environ outfilter errfilter = catchBoolIO $ do where p = (proc cmd (toCommand params)) { env = environ } + +-- | Limit a meter to only update once per unit of time. +-- +-- It's nice to display the final update to 100%, even if it comes soon +-- after a previous update. To make that happen, a total size has to be +-- provided. +rateLimitMeterUpdate :: NominalDiffTime -> Maybe Integer -> MeterUpdate -> IO MeterUpdate +rateLimitMeterUpdate delta totalsize meterupdate = do + lastupdate <- newMVar (toEnum 0 :: POSIXTime) + return $ mu lastupdate + where + mu lastupdate n@(BytesProcessed i) = case totalsize of + Just t | i >= t -> meterupdate n + _ -> do + now <- getPOSIXTime + prev <- takeMVar lastupdate + if now - prev >= delta + then do + putMVar lastupdate now + meterupdate n + else putMVar lastupdate prev |