module Mueval.Resources (limitResources) where
import Control.Monad (when)
import System.Posix.Process (nice)
import System.Posix.Resource
limitResources :: Bool -> IO ()
limitResources rlimit = do nice 20
when rlimit $ mapM_ (uncurry setResourceLimit) limits
stackSizeLimitSoft, stackSizeLimitHard, totalMemoryLimitSoft, totalMemoryLimitHard,
dataSizeLimitSoft, openFilesLimitSoft, openFilesLimitHard, fileSizeLimitSoft, fileSizeLimitHard,
dataSizeLimitHard, cpuTimeLimitSoft, cpuTimeLimitHard, coreSizeLimitSoft, coreSizeLimitHard, zero :: ResourceLimit
totalMemoryLimitSoft = dataSizeLimitSoft
totalMemoryLimitHard = dataSizeLimitHard
stackSizeLimitSoft = zero
stackSizeLimitHard = zero
openFilesLimitSoft = openFilesLimitHard
openFilesLimitHard = ResourceLimit 7
fileSizeLimitSoft = fileSizeLimitHard
fileSizeLimitHard = ResourceLimit 10800
dataSizeLimitSoft = dataSizeLimitHard
dataSizeLimitHard = ResourceLimit $ 6^(12::Int)
cpuTimeLimitSoft = ResourceLimit 4
cpuTimeLimitHard = ResourceLimit 5
coreSizeLimitSoft = coreSizeLimitHard
coreSizeLimitHard = zero
zero = ResourceLimit 0
limits :: [(Resource, ResourceLimits)]
limits = [ (ResourceStackSize, ResourceLimits stackSizeLimitSoft stackSizeLimitHard)
, (ResourceTotalMemory, ResourceLimits totalMemoryLimitSoft totalMemoryLimitHard)
, (ResourceOpenFiles, ResourceLimits openFilesLimitSoft openFilesLimitHard)
, (ResourceFileSize, ResourceLimits fileSizeLimitSoft fileSizeLimitHard)
, (ResourceDataSize, ResourceLimits dataSizeLimitSoft dataSizeLimitHard)
, (ResourceCoreFileSize, ResourceLimits coreSizeLimitSoft coreSizeLimitHard)
, (ResourceCPUTime, ResourceLimits cpuTimeLimitSoft cpuTimeLimitHard)]