diff options
author | Jose Antonio Ortega Ruiz <jao@gnu.org> | 2010-12-19 23:35:08 +0100 |
---|---|---|
committer | Jose Antonio Ortega Ruiz <jao@gnu.org> | 2010-12-19 23:35:08 +0100 |
commit | 598bfe5deeff079280e8513c55dc7bda3e8cf9a0 (patch) | |
tree | 3aa73a11257eed35579c7244b10d0769deb0d251 /Plugins/Monitors/Top.hs | |
parent | eb9f19c593c25eb4ad2a458f00ef486189818ac9 (diff) | |
download | xmobar-598bfe5deeff079280e8513c55dc7bda3e8cf9a0.tar.gz xmobar-598bfe5deeff079280e8513c55dc7bda3e8cf9a0.tar.bz2 |
Top: better computation of the initial loads
... and a bit more strictness, in an attempt to catch the sleep/awake
bug, whose origin has been eluding me all weekend.
Diffstat (limited to 'Plugins/Monitors/Top.hs')
-rw-r--r-- | Plugins/Monitors/Top.hs | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/Plugins/Monitors/Top.hs b/Plugins/Monitors/Top.hs index 03d83e2..e45210c 100644 --- a/Plugins/Monitors/Top.hs +++ b/Plugins/Monitors/Top.hs @@ -99,12 +99,13 @@ showMemInfo scale (nm, rss) = where sc = if scale > 0 then scale else 100 showMemInfos :: [MemInfo] -> Monitor [[String]] -showMemInfos ms = mapM (showMemInfo tm) $ sortTop ms +showMemInfos ms = mapM (showMemInfo tm) ms where tm = sum (map snd ms) runTopMem :: [String] -> Monitor String runTopMem _ = do - pstr <- io meminfos >>= showMemInfos + mis <- io meminfos + pstr <- showMemInfos (sortTop mis) parseTemplate $ concat pstr type Pid = Int @@ -128,31 +129,38 @@ timeMemInfos = fmap res timeMemEntries where res x = (sortBy (comparing fst) $ map fst x, map snd x, length x) combine :: Times -> Times -> Times -combine ts [] = length ts `seq` [] -combine [] ts = length ts `seq` ts +combine _ [] = [] +combine [] ts = ts combine l@((p0, (n0, t0)):ls) r@((p1, (n1, t1)):rs) | p0 == p1 && n0 == n1 = (p0, (n0, t1 - t0)) : combine ls rs | p0 <= p1 = combine ls r | otherwise = (p1, (n1, t1)) : combine l rs +take' :: Int -> [a] -> [a] +take' m l = let !r = tk m l in length l `seq` r + where tk 0 _ = [] + tk _ [] = [] + tk n (x:xs) = let !r = tk (n - 1) xs in x : r + topProcesses :: TimesRef -> Float -> IO (Int, [TimeInfo], [MemInfo]) topProcesses tref scale = do (t0, c0) <- readIORef tref (t1, mis, len) <- timeMemInfos c1 <- getCurrentTime let scx = realToFrac (diffUTCTime c1 c0) * scale - -- c0 and c1 can be equal, for instance, if we tweak the clock !scx' = if scx > 0 then scx else scale - ts = combine t0 t1 - nts = map (\(_, (nm, t)) -> (nm, min 100 (t / scx'))) ts - writeIORef tref (t1, c1) - return (len, nts, mis) + nts = map (\(_, (nm, t)) -> (nm, min 100 (t / scx'))) (combine t0 t1) + !t1' = take' (length t1) t1 + !nts' = take' maxEntries (sortTop nts) + !mis' = take' maxEntries (sortTop mis) + writeIORef tref (t1', c1) + return (len, nts', mis') showTimeInfo :: TimeInfo -> Monitor [String] showTimeInfo (n, t) = showInfo n (showDigits 0 t) t showTimeInfos :: [TimeInfo] -> Monitor [[String]] -showTimeInfos = mapM showTimeInfo . sortTop +showTimeInfos = mapM showTimeInfo runTop :: TimesRef -> Float -> [String] -> Monitor String runTop tref scale _ = do @@ -166,4 +174,6 @@ startTop a r cb = do cr <- getSysVar ClockTick c <- getCurrentTime tref <- newIORef ([], c) - runM a topConfig (runTop tref (fromIntegral cr / 100)) r cb + let scale = fromIntegral cr / 100 + _ <- topProcesses tref scale + runM a topConfig (runTop tref scale) r cb |