{-# LANGUAGE TemplateHaskell #-}
module System.CGroup.CPU (
CPU,
resolveCPUController,
CPUQuota (..),
getCPUQuota,
) where
import Control.Monad ((<=<))
import Path
import System.CGroup.Controller (Controller (..), resolveCGroupController)
data CPU
resolveCPUController :: IO (Controller CPU)
resolveCPUController :: IO (Controller CPU)
resolveCPUController = Text -> IO (Controller CPU)
forall a. Text -> IO (Controller a)
resolveCGroupController Text
"cpu"
data CPUQuota
= NoQuota
|
CPUQuota Int Int
deriving (CPUQuota -> CPUQuota -> Bool
(CPUQuota -> CPUQuota -> Bool)
-> (CPUQuota -> CPUQuota -> Bool) -> Eq CPUQuota
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CPUQuota -> CPUQuota -> Bool
$c/= :: CPUQuota -> CPUQuota -> Bool
== :: CPUQuota -> CPUQuota -> Bool
$c== :: CPUQuota -> CPUQuota -> Bool
Eq, Eq CPUQuota
Eq CPUQuota
-> (CPUQuota -> CPUQuota -> Ordering)
-> (CPUQuota -> CPUQuota -> Bool)
-> (CPUQuota -> CPUQuota -> Bool)
-> (CPUQuota -> CPUQuota -> Bool)
-> (CPUQuota -> CPUQuota -> Bool)
-> (CPUQuota -> CPUQuota -> CPUQuota)
-> (CPUQuota -> CPUQuota -> CPUQuota)
-> Ord CPUQuota
CPUQuota -> CPUQuota -> Bool
CPUQuota -> CPUQuota -> Ordering
CPUQuota -> CPUQuota -> CPUQuota
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: CPUQuota -> CPUQuota -> CPUQuota
$cmin :: CPUQuota -> CPUQuota -> CPUQuota
max :: CPUQuota -> CPUQuota -> CPUQuota
$cmax :: CPUQuota -> CPUQuota -> CPUQuota
>= :: CPUQuota -> CPUQuota -> Bool
$c>= :: CPUQuota -> CPUQuota -> Bool
> :: CPUQuota -> CPUQuota -> Bool
$c> :: CPUQuota -> CPUQuota -> Bool
<= :: CPUQuota -> CPUQuota -> Bool
$c<= :: CPUQuota -> CPUQuota -> Bool
< :: CPUQuota -> CPUQuota -> Bool
$c< :: CPUQuota -> CPUQuota -> Bool
compare :: CPUQuota -> CPUQuota -> Ordering
$ccompare :: CPUQuota -> CPUQuota -> Ordering
$cp1Ord :: Eq CPUQuota
Ord, Int -> CPUQuota -> ShowS
[CPUQuota] -> ShowS
CPUQuota -> String
(Int -> CPUQuota -> ShowS)
-> (CPUQuota -> String) -> ([CPUQuota] -> ShowS) -> Show CPUQuota
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CPUQuota] -> ShowS
$cshowList :: [CPUQuota] -> ShowS
show :: CPUQuota -> String
$cshow :: CPUQuota -> String
showsPrec :: Int -> CPUQuota -> ShowS
$cshowsPrec :: Int -> CPUQuota -> ShowS
Show)
readCGroupInt :: Path b File -> IO Int
readCGroupInt :: Path b File -> IO Int
readCGroupInt = String -> IO Int
forall a. Read a => String -> IO a
readIO (String -> IO Int)
-> (Path b File -> IO String) -> Path b File -> IO Int
forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< (String -> IO String
readFile (String -> IO String)
-> (Path b File -> String) -> Path b File -> IO String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Path b File -> String
forall b t. Path b t -> String
toFilePath)
getCPUQuota :: Controller CPU -> IO CPUQuota
getCPUQuota :: Controller CPU -> IO CPUQuota
getCPUQuota (Controller Path Abs Dir
root) = do
Int
quota <- Path Abs File -> IO Int
forall b. Path b File -> IO Int
readCGroupInt (Path Abs Dir
root Path Abs Dir -> Path Rel File -> Path Abs File
forall b t. Path b Dir -> Path Rel t -> Path b t
</> Path Rel File
cpuQuotaPath)
case Int
quota of
(-1) -> CPUQuota -> IO CPUQuota
forall (f :: * -> *) a. Applicative f => a -> f a
pure CPUQuota
NoQuota
Int
_ -> Int -> Int -> CPUQuota
CPUQuota Int
quota (Int -> CPUQuota) -> IO Int -> IO CPUQuota
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Path Abs File -> IO Int
forall b. Path b File -> IO Int
readCGroupInt (Path Abs Dir
root Path Abs Dir -> Path Rel File -> Path Abs File
forall b t. Path b Dir -> Path Rel t -> Path b t
</> Path Rel File
cpuPeriodPath)
cpuQuotaPath :: Path Rel File
cpuQuotaPath :: Path Rel File
cpuQuotaPath = $(mkRelFile "cpu.cfs_quota_us")
cpuPeriodPath :: Path Rel File
cpuPeriodPath :: Path Rel File
cpuPeriodPath = $(mkRelFile "cpu.cfs_period_us")