module Mueval.Resources (limitResources) where
import Control.Monad (zipWithM_)
import System.Posix.Process (nice)
import System.Posix.Resource
import System.Directory (setCurrentDirectory)
limitResources :: IO ()
limitResources = do setCurrentDirectory "/tmp"
nice 19
zipWithM_ (setResourceLimit) resources limits
totalMemoryLimitSoft, totalMemoryLimitHard, stackSizeLimitSoft, stackSizeLimitHard,
openFilesLimitSoft, openFilesLimitHard, fileSizeLimitSoft, fileSizeLimitHard, dataSizeLimitSoft,
dataSizeLimitHard, cpuTimeLimitSoft, cpuTimeLimitHard, coreSizeLimitSoft, coreSizeLimitHard, zero :: ResourceLimit
totalMemoryLimitSoft = dataSizeLimitSoft
totalMemoryLimitHard = dataSizeLimitHard
stackSizeLimitSoft = zero
stackSizeLimitHard = zero
openFilesLimitSoft = openFilesLimitHard
openFilesLimitHard = ResourceLimit 7
fileSizeLimitSoft = fileSizeLimitHard
fileSizeLimitHard = zero
dataSizeLimitSoft = dataSizeLimitHard
dataSizeLimitHard = ResourceLimit $ 5^(12::Int)
cpuTimeLimitSoft = ResourceLimit 3
cpuTimeLimitHard = ResourceLimit 4
coreSizeLimitSoft = coreSizeLimitHard
coreSizeLimitHard = zero
zero = ResourceLimit 0
resources :: [Resource]
resources = [ResourceStackSize,
ResourceTotalMemory,
ResourceOpenFiles,
ResourceFileSize,
ResourceDataSize,
ResourceCoreFileSize,
ResourceCPUTime]
limits :: [ResourceLimits]
limits = [ (ResourceLimits stackSizeLimitSoft stackSizeLimitHard)
, (ResourceLimits totalMemoryLimitSoft totalMemoryLimitHard)
, (ResourceLimits openFilesLimitSoft openFilesLimitHard)
, (ResourceLimits fileSizeLimitSoft fileSizeLimitHard)
, (ResourceLimits dataSizeLimitSoft dataSizeLimitHard)
, (ResourceLimits coreSizeLimitSoft coreSizeLimitHard)
, (ResourceLimits cpuTimeLimitSoft cpuTimeLimitHard)]