{-# LINE 1 "System/Posix/Resource.hsc" #-}{-# LANGUAGE CApiFFI #-}{-# LINE 5 "System/Posix/Resource.hsc" #-}{-# LANGUAGE Safe #-}{-# LINE 7 "System/Posix/Resource.hsc" #-}------------------------------------------------------------------------------- |-- Module : System.Posix.Resource-- Copyright : (c) The University of Glasgow 2003-- License : BSD-style (see the file libraries/base/LICENSE)---- Maintainer : libraries@haskell.org-- Stability : provisional-- Portability : non-portable (requires POSIX)---- POSIX resource support-------------------------------------------------------------------------------moduleSystem.Posix.Resource(-- * Resource LimitsResourceLimit(..),ResourceLimits(..),Resource(..),getResourceLimit,setResourceLimit,)whereimportSystem.Posix.TypesimportForeignimportForeign.C{-# LINE 39 "System/Posix/Resource.hsc" #-}{-# LINE 42 "System/Posix/Resource.hsc" #-}-- ------------------------------------------------------------------------------- Resource limitsdataResource=ResourceCoreFileSize|ResourceCPUTime|ResourceDataSize|ResourceFileSize|ResourceOpenFiles|ResourceStackSize{-# LINE 54 "System/Posix/Resource.hsc" #-}|ResourceTotalMemory{-# LINE 56 "System/Posix/Resource.hsc" #-}deriving(Eq,Show)dataResourceLimits=ResourceLimits{softLimit,hardLimit::ResourceLimit}deriving(Eq,Show)dataResourceLimit=ResourceLimitInfinity|ResourceLimitUnknown|ResourceLimitIntegerderiving(Eq,Show){-# LINE 81 "System/Posix/Resource.hsc" #-}data{-# CTYPE"struct rlimit"#-}RLimitforeignimportcapiunsafe"HsUnix.h getrlimit"c_getrlimit::CInt->PtrRLimit->IOCIntforeignimportcapiunsafe"HsUnix.h setrlimit"c_setrlimit::CInt->PtrRLimit->IOCIntgetResourceLimit::Resource->IOResourceLimitsgetResourceLimitres=doallocaBytes(16)$\p_rlimit->do{-# LINE 93 "System/Posix/Resource.hsc" #-}throwErrnoIfMinus1_"getResourceLimit"$c_getrlimit(packResourceres)p_rlimitsoft<-((\hsc_ptr->peekByteOffhsc_ptr0))p_rlimit{-# LINE 96 "System/Posix/Resource.hsc" #-}hard<-((\hsc_ptr->peekByteOffhsc_ptr8))p_rlimit{-# LINE 97 "System/Posix/Resource.hsc" #-}return(ResourceLimits{softLimit=unpackRLimitsoft,hardLimit=unpackRLimithard})setResourceLimit::Resource->ResourceLimits->IO()setResourceLimitresResourceLimits{softLimit=soft,hardLimit=hard}=doallocaBytes(16)$\p_rlimit->do{-# LINE 105 "System/Posix/Resource.hsc" #-}((\hsc_ptr->pokeByteOffhsc_ptr0))p_rlimit(packRLimitsoftTrue){-# LINE 106 "System/Posix/Resource.hsc" #-}((\hsc_ptr->pokeByteOffhsc_ptr8))p_rlimit(packRLimithardFalse){-# LINE 107 "System/Posix/Resource.hsc" #-}throwErrnoIfMinus1_"setResourceLimit"$c_setrlimit(packResourceres)p_rlimitreturn()packResource::Resource->CIntpackResourceResourceCoreFileSize=(4){-# LINE 113 "System/Posix/Resource.hsc" #-}packResourceResourceCPUTime=(0){-# LINE 114 "System/Posix/Resource.hsc" #-}packResourceResourceDataSize=(2){-# LINE 115 "System/Posix/Resource.hsc" #-}packResourceResourceFileSize=(1){-# LINE 116 "System/Posix/Resource.hsc" #-}packResourceResourceOpenFiles=(7){-# LINE 117 "System/Posix/Resource.hsc" #-}packResourceResourceStackSize=(3){-# LINE 118 "System/Posix/Resource.hsc" #-}{-# LINE 119 "System/Posix/Resource.hsc" #-}packResourceResourceTotalMemory=(9){-# LINE 120 "System/Posix/Resource.hsc" #-}{-# LINE 121 "System/Posix/Resource.hsc" #-}unpackRLimit::CRLim->ResourceLimitunpackRLimit(18446744073709551615)=ResourceLimitInfinity{-# LINE 124 "System/Posix/Resource.hsc" #-}unpackRLimitother{-# LINE 126 "System/Posix/Resource.hsc" #-}|((18446744073709551615)::CRLim)/=(18446744073709551615){-# LINE 127 "System/Posix/Resource.hsc" #-},other==(18446744073709551615){-# LINE 128 "System/Posix/Resource.hsc" #-}=ResourceLimitUnknown{-# LINE 130 "System/Posix/Resource.hsc" #-}{-# LINE 131 "System/Posix/Resource.hsc" #-}|((18446744073709551615)::CRLim)/=(18446744073709551615){-# LINE 132 "System/Posix/Resource.hsc" #-},other==(18446744073709551615){-# LINE 133 "System/Posix/Resource.hsc" #-}{-# LINE 136 "System/Posix/Resource.hsc" #-}=ResourceLimitUnknown-- (*) This pattern match is redundant if RLIM_SAVED_MAX and RLIM_SAVED_CUR-- are both defined and are equal. This redundancy is only detected by GHC-- starting from version 9.5, so we use 'considerAccessible'.{-# LINE 141 "System/Posix/Resource.hsc" #-}|otherwise=ResourceLimit(fromIntegralother)packRLimit::ResourceLimit->Bool->CRLimpackRLimitResourceLimitInfinity_=(18446744073709551615){-# LINE 145 "System/Posix/Resource.hsc" #-}{-# LINE 146 "System/Posix/Resource.hsc" #-}packRLimitResourceLimitUnknownTrue=(18446744073709551615){-# LINE 147 "System/Posix/Resource.hsc" #-}{-# LINE 148 "System/Posix/Resource.hsc" #-}{-# LINE 149 "System/Posix/Resource.hsc" #-}packRLimitResourceLimitUnknownFalse=(18446744073709551615){-# LINE 150 "System/Posix/Resource.hsc" #-}{-# LINE 151 "System/Posix/Resource.hsc" #-}{-# LINE 157 "System/Posix/Resource.hsc" #-}packRLimit(ResourceLimitother)_=fromIntegralother-- ------------------------------------------------------------------------------- Test code{- import System.Posix import Control.Monad main = do zipWithM_ (\r n -> setResourceLimit r ResourceLimits{ hardLimit = ResourceLimit n, softLimit = ResourceLimit n }) allResources [1..] showAll mapM_ (\r -> setResourceLimit r ResourceLimits{ hardLimit = ResourceLimit 1, softLimit = ResourceLimitInfinity }) allResources -- should fail showAll = mapM_ (\r -> getResourceLimit r >>= (putStrLn . showRLims)) allResources allResources = [ResourceCoreFileSize, ResourceCPUTime, ResourceDataSize, ResourceFileSize, ResourceOpenFiles, ResourceStackSize #ifdef RLIMIT_AS , ResourceTotalMemory #endif ] showRLims ResourceLimits{hardLimit=h,softLimit=s} = "hard: " ++ showRLim h ++ ", soft: " ++ showRLim s showRLim ResourceLimitInfinity = "infinity" showRLim ResourceLimitUnknown = "unknown" showRLim (ResourceLimit other) = show other -}{-# LINE 200 "System/Posix/Resource.hsc" #-}