packages feed

proof-assistant-bot-0.2.0: src/Proof/Assistant/ResourceLimit.hs

{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TypeApplications #-}
module Proof.Assistant.ResourceLimit where

import GHC.Natural
import System.Posix.Process (nice)
import System.Posix.Resource

import Proof.Assistant.Helpers
import Proof.Assistant.Settings

-- | Make ResourceLimits from soft/hard limits.
makeResourceLimits :: Limit -> ResourceLimits
makeResourceLimits (Limit soft hard)
  = ResourceLimits (toResourceLimit soft) (toResourceLimit hard)
  where
    toResourceLimit = ResourceLimit . fromIntegral

-- | Read Resources from 'ResourceSettings'.
makeLimits :: ResourceSettings -> [(Resource, ResourceLimits)]
makeLimits ResourceSettings{..} =
  [ (ResourceTotalMemory,  makeResourceLimits totalMemory)
  , (ResourceOpenFiles,    makeResourceLimits openFiles)
  , (ResourceFileSize,     makeResourceLimits fileSize)
  , (ResourceDataSize,     makeResourceLimits dataSize)
  , (ResourceCPUTime,      makeResourceLimits cpuTime)
  ]

-- | Read limits from 'ResourceSettings' and set them for current thread.
setLimits :: ResourceSettings -> IO ()
setLimits = mapM_ (uncurry setResourceLimit) . makeLimits

-- | Set 'Priority' for current thread.
setPriority :: Priority -> IO ()
setPriority = nice . toInt @_ @Natural