From 31715e3db637702d1289819909131a32abb3777a Mon Sep 17 00:00:00 2001
From: Jose Antonio Ortega Ruiz <jao@gnu.org>
Date: Sun, 13 Feb 2011 04:57:17 +0100
Subject: Cpu and MultiCpu should also be more accurate now

---
 src/Plugins/Monitors.hs          | 36 ++++++++++++++++++------------------
 src/Plugins/Monitors/Cpu.hs      | 34 ++++++++++++++++++++++------------
 src/Plugins/Monitors/MultiCpu.hs | 24 +++++++++++++++++-------
 src/Plugins/Monitors/Net.hs      |  5 +++--
 4 files changed, 60 insertions(+), 39 deletions(-)

(limited to 'src/Plugins')

diff --git a/src/Plugins/Monitors.hs b/src/Plugins/Monitors.hs
index 616ae21..0007bec 100644
--- a/src/Plugins/Monitors.hs
+++ b/src/Plugins/Monitors.hs
@@ -104,28 +104,28 @@ instance Exec Monitors where
 #ifdef ALSA
     alias (Volume m c _ _) = m ++ ":" ++ c
 #endif
-    start (Weather  s a r) = runM (a ++ [s]) weatherConfig  runWeather    r
     start (Network  i a r) = startNet i a r
-    start (Thermal  z a r) = runM (a ++ [z]) thermalConfig  runThermal    r
-    start (Memory     a r) = runM a          memConfig      runMem        r
-    start (Swap       a r) = runM a          swapConfig     runSwap       r
-    start (Cpu        a r) = runM a          cpuConfig      runCpu        r
-    start (MultiCpu   a r) = runM a          multiCpuConfig runMultiCpu   r
-    start (Battery    a r) = runM a          battConfig     runBatt       r
-    start (BatteryP s a r) = runM a          battConfig     (runBatt' s)  r
-    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 (TopMem     a r) = runM a          topMemConfig   runTopMem     r
-    start (Uptime     a r) = runM a          uptimeConfig   runUptime     r
-    start (TopProc    a r) = startTop a r
+    start (Cpu a r) = startCpu a r
+    start (MultiCpu a r) = startMultiCpu a r
+    start (TopProc a r) = startTop a r
+    start (TopMem a r) = runM a topMemConfig runTopMem r
+    start (Weather s a r) = runM (a ++ [s]) weatherConfig runWeather r
+    start (Thermal z a r) = runM (a ++ [z]) thermalConfig runThermal r
+    start (Memory a r) = runM a memConfig runMem r
+    start (Swap a r) = runM a swapConfig runSwap r
+    start (Battery a r) = runM a battConfig runBatt r
+    start (BatteryP s a r) = runM a battConfig (runBatt' s) r
+    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 (Uptime a r) = runM a uptimeConfig runUptime r
 #ifdef IWLIB
-    start (Wireless i a r) = runM (a ++ [i]) wirelessConfig runWireless   r
+    start (Wireless i a r) = runM (a ++ [i]) wirelessConfig runWireless r
 #endif
 #ifdef LIBMPD
-    start (MPD        a r) = runM a          mpdConfig      runMPD        r
+    start (MPD a r) = runM a mpdConfig runMPD r
 #endif
 #ifdef ALSA
-    start (Volume m c a r) = runM a          volumeConfig  (runVolume m c) r
+    start (Volume m c a r) = runM a volumeConfig (runVolume m c) r
 #endif
diff --git a/src/Plugins/Monitors/Cpu.hs b/src/Plugins/Monitors/Cpu.hs
index 8715245..919f7a4 100644
--- a/src/Plugins/Monitors/Cpu.hs
+++ b/src/Plugins/Monitors/Cpu.hs
@@ -1,7 +1,8 @@
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Plugins.Monitors.Cpu
--- Copyright   :  (c) Andrea Rossato
+-- Copyright   :  (c) 2011 Jose Antonio Ortega Ruiz
+--                (c) 2007-2010 Andrea Rossato
 -- License     :  BSD-style (see LICENSE)
 --
 -- Maintainer  :  Jose A. Ortega Ruiz <jao@gnu.org>
@@ -12,27 +13,30 @@
 --
 -----------------------------------------------------------------------------
 
-module Plugins.Monitors.Cpu where
+module Plugins.Monitors.Cpu (startCpu) where
 
 import Plugins.Monitors.Common
 import qualified Data.ByteString.Lazy.Char8 as B
+import Data.IORef (IORef, newIORef, readIORef, writeIORef)
 
 cpuConfig :: IO MConfig
 cpuConfig = mkMConfig
        "Cpu: <total>%"
        ["bar","total","user","nice","system","idle"]
 
+type CpuDataRef = IORef [Float]
+
 cpuData :: IO [Float]
-cpuData = do s <- B.readFile "/proc/stat"
-             return $ cpuParser s
+cpuData = cpuParser `fmap` B.readFile "/proc/stat"
 
 cpuParser :: B.ByteString -> [Float]
-cpuParser =
-    map (read . B.unpack) . tail . B.words . head . B.lines
+cpuParser = map (read . B.unpack) . tail . B.words . head . B.lines
 
-parseCPU :: IO [Float]
-parseCPU =
-    do (a,b) <- doActionTwiceWithDelay 750000 cpuData
+parseCpu :: CpuDataRef -> IO [Float]
+parseCpu cref =
+    do a <- readIORef cref
+       b <- cpuData
+       writeIORef cref b
        let dif = zipWith (-) b a
            tot = foldr (+) 0 dif
            percent = map (/ tot) dif
@@ -46,8 +50,14 @@ formatCpu xs = do
   ps <- showPercentsWithColors (t:xs)
   return (b:ps)
 
-runCpu :: [String] -> Monitor String
-runCpu _ =
-    do c <- io parseCPU
+runCpu :: CpuDataRef -> [String] -> Monitor String
+runCpu cref _ =
+    do c <- io (parseCpu cref)
        l <- formatCpu c
        parseTemplate l
+
+startCpu :: [String] -> Int -> (String -> IO ()) -> IO ()
+startCpu a r cb = do
+  cref <- newIORef []
+  _ <- parseCpu cref
+  runM a cpuConfig (runCpu cref) r cb
diff --git a/src/Plugins/Monitors/MultiCpu.hs b/src/Plugins/Monitors/MultiCpu.hs
index d93c788..a1bb082 100644
--- a/src/Plugins/Monitors/MultiCpu.hs
+++ b/src/Plugins/Monitors/MultiCpu.hs
@@ -12,11 +12,12 @@
 --
 -----------------------------------------------------------------------------
 
-module Plugins.Monitors.MultiCpu(multiCpuConfig, runMultiCpu) where
+module Plugins.Monitors.MultiCpu (startMultiCpu) where
 
 import Plugins.Monitors.Common
 import qualified Data.ByteString.Lazy.Char8 as B
 import Data.List (isPrefixOf, transpose, unfoldr)
+import Data.IORef (IORef, newIORef, readIORef, writeIORef)
 
 multiCpuConfig :: IO MConfig
 multiCpuConfig =
@@ -26,6 +27,7 @@ multiCpuConfig =
                          , k <- monitors]
     where monitors = ["bar","total","user","nice","system","idle"]
 
+type CpuDataRef = IORef [[Float]]
 
 cpuData :: IO [[Float]]
 cpuData = parse `fmap` B.readFile "/proc/stat"
@@ -35,9 +37,11 @@ cpuData = parse `fmap` B.readFile "/proc/stat"
         isCpu _ = False
         parseList = map (parseFloat . B.unpack) . tail
 
-parseCpuData :: IO [[Float]]
-parseCpuData =
-  do (as, bs) <- doActionTwiceWithDelay 950000 cpuData
+parseCpuData :: CpuDataRef -> IO [[Float]]
+parseCpuData cref =
+  do as <- readIORef cref
+     bs <- cpuData
+     writeIORef cref bs
      let p0 = zipWith percent bs as
      return p0
 
@@ -68,9 +72,15 @@ formatAutoCpus :: [String] -> Monitor [String]
 formatAutoCpus [] = return $ replicate 6 ""
 formatAutoCpus xs = return $ map unwords (groupData xs)
 
-runMultiCpu :: [String] -> Monitor String
-runMultiCpu _ =
-  do c <- io parseCpuData
+runMultiCpu :: CpuDataRef -> [String] -> Monitor String
+runMultiCpu cref _ =
+  do c <- io $ parseCpuData cref
      l <- formatMultiCpus c
      a <- formatAutoCpus l
      parseTemplate $ a ++ l
+
+startMultiCpu :: [String] -> Int -> (String -> IO ()) -> IO ()
+startMultiCpu a r cb = do
+  cref <- newIORef [[]]
+  _ <- parseCpuData cref
+  runM a multiCpuConfig (runMultiCpu cref) r cb
diff --git a/src/Plugins/Monitors/Net.hs b/src/Plugins/Monitors/Net.hs
index 500a753..8382542 100644
--- a/src/Plugins/Monitors/Net.hs
+++ b/src/Plugins/Monitors/Net.hs
@@ -1,7 +1,8 @@
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Plugins.Monitors.Net
--- Copyright   :  (c) Andrea Rossato
+-- Copyright   :  (c) 2011 Jose Antonio Ortega Ruiz
+--                (c) 2007-2010 Andrea Rossato
 -- License     :  BSD-style (see LICENSE)
 --
 -- Maintainer  :  Jose A. Ortega Ruiz <jao@gnu.org>
@@ -12,7 +13,7 @@
 --
 -----------------------------------------------------------------------------
 
-module Plugins.Monitors.Net (netConfig, startNet) where
+module Plugins.Monitors.Net (startNet) where
 
 import Plugins.Monitors.Common
 
-- 
cgit v1.2.3