diff options
| -rw-r--r-- | NEWS | 2 | ||||
| -rw-r--r-- | src/Plugins/Monitors.hs | 2 | ||||
| -rw-r--r-- | src/Plugins/Monitors/Disk.hs | 31 | 
3 files changed, 23 insertions, 12 deletions
| @@ -28,7 +28,7 @@ _Bug fixes_    - [issue 40]: Battery monitor now supports the new power_now, that      replaces current_now in linux kernels for v. 2.36 and above.    - [issue 42]: More accurate net monitor rates. -  - Cpu and MultiCpu monitors are also more accurate now. +  - DiskIO, Cpu and MultiCpu monitors are also more accurate now.    - Text is now correctly centered vertically.    - `FullBM` border spec fixed. diff --git a/src/Plugins/Monitors.hs b/src/Plugins/Monitors.hs index 0007bec..4f1795b 100644 --- a/src/Plugins/Monitors.hs +++ b/src/Plugins/Monitors.hs @@ -118,7 +118,7 @@ instance Exec Monitors where      start (CpuFreq a r) = runM a cpuFreqConfig runCpuFreq r      start (CoreTemp a r) = runM a coreTempConfig runCoreTemp r      start (DiskU s a r) = runM a diskUConfig (runDiskU s) r -    start (DiskIO s a r) = runM a diskIOConfig (runDiskIO s) r +    start (DiskIO s a r) = startDiskIO s a r      start (Uptime a r) = runM a uptimeConfig runUptime r  #ifdef IWLIB      start (Wireless i a r) = runM (a ++ [i]) wirelessConfig runWireless r diff --git a/src/Plugins/Monitors/Disk.hs b/src/Plugins/Monitors/Disk.hs index f3a7a2a..33b3f5d 100644 --- a/src/Plugins/Monitors/Disk.hs +++ b/src/Plugins/Monitors/Disk.hs @@ -1,7 +1,7 @@  -----------------------------------------------------------------------------  -- |  -- Module      :  Plugins.Monitors.Disk --- Copyright   :  (c) Jose A Ortega Ruiz +-- Copyright   :  (c) 2010, 2011 Jose A Ortega Ruiz  -- License     :  BSD-style (see LICENSE)  --  -- Maintainer  :  Jose A Ortega Ruiz <jao@gnu.org> @@ -12,13 +12,13 @@  --  ----------------------------------------------------------------------------- -module Plugins.Monitors.Disk ( diskUConfig, runDiskU -                             , diskIOConfig, runDiskIO -                             ) where +module Plugins.Monitors.Disk (diskUConfig, runDiskU, startDiskIO) where  import Plugins.Monitors.Common  import StatFS +import Data.IORef (IORef, newIORef, readIORef, writeIORef) +  import Control.Monad (zipWithM)  import qualified Data.ByteString.Lazy.Char8 as B  import Data.List (isPrefixOf, find, intercalate) @@ -33,6 +33,7 @@ diskUConfig = mkMConfig ""  type DevName = String  type Path = String +type DevDataRef = IORef [(DevName, [Float])]  mountedDevices :: [String] -> IO [(DevName, Path)]  mountedDevices req = do @@ -52,9 +53,11 @@ diskData = do    let extract ws = (head ws, map read (tail ws))    return $ map (extract . map B.unpack . drop 2 . B.words) (B.lines s) -mountedData :: [DevName] -> IO [(DevName, [Float])] -mountedData devs = do -  (dt, dt') <- doActionTwiceWithDelay 750000 diskData +mountedData :: DevDataRef -> [DevName] -> IO [(DevName, [Float])] +mountedData dref devs = do +  dt <- readIORef dref +  dt' <- diskData +  writeIORef dref dt'    return $ map (parseDev (zipWith diff dt' dt)) devs    where diff (dev, xs) (_, ys) = (dev, zipWith (-) xs ys) @@ -110,13 +113,21 @@ runDiskIO' (tmp, xs) = do    setConfigValue tmp template    parseTemplate $ s ++ b -runDiskIO :: [(String, String)] -> [String] -> Monitor String -runDiskIO disks _ = do +runDiskIO :: DevDataRef -> [(String, String)] -> [String] -> Monitor String +runDiskIO dref disks _ = do    mounted <- io $ mountedDevices (map fst disks) -  dat <- io $ mountedData (map fst mounted) +  dat <- io $ mountedData dref (map fst mounted)    strs <- mapM runDiskIO' $ devTemplates disks mounted dat    return $ intercalate " " strs +startDiskIO :: [(String, String)] -> +               [String] -> Int -> (String -> IO ()) -> IO () +startDiskIO disks args rate cb = do +  mounted <- mountedDevices (map fst disks) +  dref <- newIORef (map (\d -> (fst d, repeat 0)) mounted) +  _ <- mountedData dref (map fst mounted) +  runM args diskIOConfig (runDiskIO dref disks) rate cb +  runDiskU' :: String -> String -> Monitor String  runDiskU' tmp path = do    setConfigValue tmp template | 
