diff options
| author | Jose Antonio Ortega Ruiz <jao@gnu.org> | 2010-02-12 21:45:20 +0100 | 
|---|---|---|
| committer | Jose Antonio Ortega Ruiz <jao@gnu.org> | 2010-02-12 21:45:20 +0100 | 
| commit | 9670c0b9e835965717486ed815db993244df9cea (patch) | |
| tree | 727a984e626060f7fb68ec33992188728c097f88 | |
| parent | 8db46dec89195aa0ad4f29122793514daf4a7598 (diff) | |
| download | xmobar-9670c0b9e835965717486ed815db993244df9cea.tar.gz xmobar-9670c0b9e835965717486ed815db993244df9cea.tar.bz2 | |
Using plain IORef instead of MVar in TopCpu
Ignore-this: cb81e0c1b5ba9b3837924199f731b20f
darcs-hash:20100212204520-1d908-2b1e352c3fb7499373e6e362157b795750e511cc.gz
| -rw-r--r-- | Plugins/Monitors/Top.hs | 33 | 
1 files changed, 17 insertions, 16 deletions
| diff --git a/Plugins/Monitors/Top.hs b/Plugins/Monitors/Top.hs index 3473785..2e235d8 100644 --- a/Plugins/Monitors/Top.hs +++ b/Plugins/Monitors/Top.hs @@ -19,13 +19,13 @@ module Plugins.Monitors.Top (startTopCpu, topMemConfig, runTopMem) where  import Plugins.Monitors.Common  import Control.Exception (SomeException, handle, evaluate) -import Control.Concurrent  import System.Directory  import System.FilePath  import System.Posix.Unistd (getSysVar, SysVar(ClockTick))  import Foreign.C.Types  import Data.List (sortBy, foldl')  import Data.Ord (comparing) +import Data.IORef  import Data.IntMap (IntMap)  import qualified Data.IntMap as M @@ -109,7 +109,7 @@ type Pid = Int  type TimeInfo = (String, Float)  type TimeEntry = (Pid, TimeInfo)  type Times = IntMap TimeInfo -type TIVar = MVar Times +type TimesRef = IORef Times  timeinfo :: FilePath -> IO TimeEntry  timeinfo = handlePidFile (0, ("", 0)) $ \fs -> @@ -130,28 +130,29 @@ combineTimeInfos :: Times -> Times -> Times  combineTimeInfos !t0 !t1 = M.intersectionWith timeDiff t1 t0    where timeDiff (n, x1) (_, x0) = (n, (x1 - x0)) -topTimeProcesses :: Int -> TIVar -> Float -> IO [TimeInfo] -topTimeProcesses n tivar lapse = do -  modifyMVar tivar $ \t0 -> -    timeinfos >>= (\t1 -> -                    let !ts = M.elems $ combineTimeInfos t0 t1 -                        !sts = take n $ sortBy (flip (comparing snd)) ts -                        !nts = map norm sts -                        norm (nm, t) = (nm, 100 * t / lapse) -                    in return $ (t1, nts)) +topTimeProcesses :: Int -> TimesRef -> Float -> IO [TimeInfo] +topTimeProcesses n tref lapse = do +  t1 <- timeinfos +  t0 <- readIORef tref +  writeIORef tref $! t1 +  let !ts = M.elems $ combineTimeInfos t0 t1 +      !sts = take n $ sortBy (flip (comparing snd)) ts +      !nts = map norm sts +      norm (nm, t) = (nm, 100 * t / lapse) +  return nts  showTimeInfo :: TimeInfo -> Monitor [String]  showTimeInfo (n, t) = showInfo n (showDigits 1 t) t -runTopCpu :: TIVar -> Float -> [String] -> Monitor String -runTopCpu tivar lapse _ = do -   ps <- io $ topTimeProcesses maxProc tivar lapse +runTopCpu :: TimesRef -> Float -> [String] -> Monitor String +runTopCpu tref lapse _ = do +   ps <- io $ topTimeProcesses maxProc tref lapse     pstr <- mapM showTimeInfo ps     parseTemplate $ concat pstr  startTopCpu :: [String] -> Int -> (String -> IO ()) -> IO ()  startTopCpu a r cb = do    t <- getSysVar ClockTick -  tivar <- newMVar M.empty +  tref <- newIORef M.empty    let lapse = (fromIntegral r * fromIntegral t) / 10 -  runM a topCpuConfig (runTopCpu tivar lapse) r cb +  runM a topCpuConfig (runTopCpu tref lapse) r cb | 
