diff options
Diffstat (limited to 'src/Xmobar/Plugins/Monitors/Cpu')
| -rw-r--r-- | src/Xmobar/Plugins/Monitors/Cpu/Common.hs | 25 | ||||
| -rw-r--r-- | src/Xmobar/Plugins/Monitors/Cpu/FreeBSD.hs | 49 | ||||
| -rw-r--r-- | src/Xmobar/Plugins/Monitors/Cpu/Linux.hs | 61 | 
3 files changed, 135 insertions, 0 deletions
| diff --git a/src/Xmobar/Plugins/Monitors/Cpu/Common.hs b/src/Xmobar/Plugins/Monitors/Cpu/Common.hs new file mode 100644 index 0000000..ccec535 --- /dev/null +++ b/src/Xmobar/Plugins/Monitors/Cpu/Common.hs @@ -0,0 +1,25 @@ +----------------------------------------------------------------------------- +-- | +-- Module      :  Plugins.Monitors.Cpu.Common +-- Copyright   :  (c) 2011, 2017 Jose Antonio Ortega Ruiz +--                (c) 2007-2010 Andrea Rossato +-- License     :  BSD-style (see LICENSE) +-- +-- Maintainer  :  Jose A. Ortega Ruiz <jao@gnu.org> +-- Stability   :  unstable +-- Portability :  unportable +-- +-- A cpu monitor for Xmobar +-- +----------------------------------------------------------------------------- + +module Xmobar.Plugins.Monitors.Cpu.Common (CpuData(..)) where + +data CpuData = CpuData { +      cpuUser :: !Float, +      cpuNice :: !Float, +      cpuSystem :: !Float, +      cpuIdle :: !Float, +      cpuIowait :: !Float, +      cpuTotal :: !Float +    } diff --git a/src/Xmobar/Plugins/Monitors/Cpu/FreeBSD.hs b/src/Xmobar/Plugins/Monitors/Cpu/FreeBSD.hs new file mode 100644 index 0000000..7cb711a --- /dev/null +++ b/src/Xmobar/Plugins/Monitors/Cpu/FreeBSD.hs @@ -0,0 +1,49 @@ +----------------------------------------------------------------------------- +-- | +-- Module      :  Plugins.Monitors.Cpu.FreeBSD +-- Copyright   :  (c) 2011, 2017 Jose Antonio Ortega Ruiz +--                (c) 2007-2010 Andrea Rossato +-- License     :  BSD-style (see LICENSE) +-- +-- Maintainer  :  Jose A. Ortega Ruiz <jao@gnu.org> +-- Stability   :  unstable +-- Portability :  unportable +-- +-- A cpu monitor for Xmobar +-- +----------------------------------------------------------------------------- + +module Xmobar.Plugins.Monitors.Cpu.FreeBSD (parseCpu +                                           , CpuDataRef +                                           , cpuData) where + +import Xmobar.Plugins.Monitors.Cpu.Common (CpuData(..)) +import Data.IORef (IORef, readIORef, writeIORef) +import System.BSD.Sysctl (sysctlPeekArray) + +-- kern.cp_time data from the previous iteration for computing the difference +type CpuDataRef = IORef [Word] + +cpuData :: IO [Word] +cpuData = sysctlPeekArray "kern.cp_time" :: IO [Word] + +parseCpu :: CpuDataRef -> IO CpuData +parseCpu cref = do +    prev <- readIORef cref +    curr <- cpuData +    writeIORef cref curr +    let diff = map fromIntegral $ zipWith (-) curr prev +        user = head diff +        nice = diff !! 1 +        system = diff !! 2 +        intr = diff !! 3 +        idle = diff !! 4 +        total = user + nice + system + intr + idle +    return CpuData +      { cpuUser = user/total +      , cpuNice = nice/total +      , cpuSystem = (system+intr)/total +      , cpuIdle = idle/total +      , cpuIowait = 0 +      , cpuTotal = user/total +      } diff --git a/src/Xmobar/Plugins/Monitors/Cpu/Linux.hs b/src/Xmobar/Plugins/Monitors/Cpu/Linux.hs new file mode 100644 index 0000000..39baea6 --- /dev/null +++ b/src/Xmobar/Plugins/Monitors/Cpu/Linux.hs @@ -0,0 +1,61 @@ +----------------------------------------------------------------------------- +-- | +-- Module      :  Plugins.Monitors.Cpu.Linux +-- Copyright   :  (c) 2011, 2017 Jose Antonio Ortega Ruiz +--                (c) 2007-2010 Andrea Rossato +-- License     :  BSD-style (see LICENSE) +-- +-- Maintainer  :  Jose A. Ortega Ruiz <jao@gnu.org> +-- Stability   :  unstable +-- Portability :  unportable +-- +-- A cpu monitor for Xmobar +-- +----------------------------------------------------------------------------- + +module Xmobar.Plugins.Monitors.Cpu.Linux (parseCpu +                                         , CpuDataRef +                                         , cpuData) where + +import Xmobar.Plugins.Monitors.Cpu.Common (CpuData(..)) +import qualified Data.ByteString.Lazy.Char8 as B +import Data.IORef (IORef, readIORef, writeIORef) + +type CpuDataRef = IORef [Int] + +-- Details about the fields here: https://www.kernel.org/doc/Documentation/filesystems/proc.txt +cpuData :: IO [Int] +cpuData = cpuParser <$> B.readFile "/proc/stat" + +readInt :: B.ByteString -> Int +readInt bs = case B.readInt bs of +               Nothing -> 0 +               Just (i, _) -> i + +cpuParser :: B.ByteString -> [Int] +cpuParser = map readInt . tail . B.words . head . B.lines + +convertToCpuData :: [Float] -> CpuData +convertToCpuData (u:n:s:ie:iw:_) = +  CpuData +    { cpuUser = u +    , cpuNice = n +    , cpuSystem = s +    , cpuIdle = ie +    , cpuIowait = iw +    , cpuTotal = sum [u, n, s] +    } +convertToCpuData args = error $ "convertToCpuData: Unexpected list" <> show args + +parseCpu :: CpuDataRef -> IO CpuData +parseCpu cref = +    do a <- readIORef cref +       b <- cpuData +       writeIORef cref b +       let dif = zipWith (-) b a +           tot = fromIntegral $ sum dif +           safeDiv n = case tot of +                         0 -> 0 +                         v -> fromIntegral n / v +           percent = map safeDiv dif +       return $ convertToCpuData percent | 
