{-# LINE 1 "libraries/unix/System/Posix/Resource.hsc" #-}
{-# LANGUAGE CApiFFI #-}
{-# LINE 3 "libraries/unix/System/Posix/Resource.hsc" #-}
{-# LANGUAGE Safe #-}
{-# LINE 7 "libraries/unix/System/Posix/Resource.hsc" #-}
module System.Posix.Resource (
ResourceLimit(..), ResourceLimits(..), Resource(..),
getResourceLimit,
setResourceLimit,
) where
import System.Posix.Types
import Foreign
import Foreign.C
data Resource
= ResourceCoreFileSize
| ResourceCPUTime
| ResourceDataSize
| ResourceFileSize
| ResourceOpenFiles
| ResourceStackSize
{-# LINE 45 "libraries/unix/System/Posix/Resource.hsc" #-}
| ResourceTotalMemory
{-# LINE 47 "libraries/unix/System/Posix/Resource.hsc" #-}
deriving Eq
data ResourceLimits
= ResourceLimits { softLimit, hardLimit :: ResourceLimit }
deriving Eq
data ResourceLimit
= ResourceLimitInfinity
| ResourceLimitUnknown
| ResourceLimit Integer
deriving Eq
data {-# CTYPE "struct rlimit" #-} RLimit
foreign import capi unsafe "HsUnix.h getrlimit"
c_getrlimit :: CInt -> Ptr RLimit -> IO CInt
foreign import capi unsafe "HsUnix.h setrlimit"
c_setrlimit :: CInt -> Ptr RLimit -> IO CInt
getResourceLimit :: Resource -> IO ResourceLimits
getResourceLimit res = do
allocaBytes (16) $ \p_rlimit -> do
{-# LINE 70 "libraries/unix/System/Posix/Resource.hsc" #-}
throwErrnoIfMinus1_ "getResourceLimit" $
c_getrlimit (packResource res) p_rlimit
soft <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) p_rlimit
{-# LINE 73 "libraries/unix/System/Posix/Resource.hsc" #-}
hard <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) p_rlimit
{-# LINE 74 "libraries/unix/System/Posix/Resource.hsc" #-}
return (ResourceLimits {
softLimit = unpackRLimit soft,
hardLimit = unpackRLimit hard
})
setResourceLimit :: Resource -> ResourceLimits -> IO ()
setResourceLimit res ResourceLimits{softLimit=soft,hardLimit=hard} = do
allocaBytes (16) $ \p_rlimit -> do
{-# LINE 82 "libraries/unix/System/Posix/Resource.hsc" #-}
((\hsc_ptr -> pokeByteOff hsc_ptr 0)) p_rlimit (packRLimit soft True)
{-# LINE 83 "libraries/unix/System/Posix/Resource.hsc" #-}
((\hsc_ptr -> pokeByteOff hsc_ptr 8)) p_rlimit (packRLimit hard False)
{-# LINE 84 "libraries/unix/System/Posix/Resource.hsc" #-}
throwErrnoIfMinus1_ "setResourceLimit" $
c_setrlimit (packResource res) p_rlimit
return ()
packResource :: Resource -> CInt
packResource ResourceCoreFileSize = (4)
{-# LINE 90 "libraries/unix/System/Posix/Resource.hsc" #-}
packResource ResourceCPUTime = (0)
{-# LINE 91 "libraries/unix/System/Posix/Resource.hsc" #-}
packResource ResourceDataSize = (2)
{-# LINE 92 "libraries/unix/System/Posix/Resource.hsc" #-}
packResource ResourceFileSize = (1)
{-# LINE 93 "libraries/unix/System/Posix/Resource.hsc" #-}
packResource ResourceOpenFiles = (7)
{-# LINE 94 "libraries/unix/System/Posix/Resource.hsc" #-}
packResource ResourceStackSize = (3)
{-# LINE 95 "libraries/unix/System/Posix/Resource.hsc" #-}
{-# LINE 96 "libraries/unix/System/Posix/Resource.hsc" #-}
packResource ResourceTotalMemory = (9)
{-# LINE 97 "libraries/unix/System/Posix/Resource.hsc" #-}
{-# LINE 98 "libraries/unix/System/Posix/Resource.hsc" #-}
unpackRLimit :: CRLim -> ResourceLimit
unpackRLimit (18446744073709551615) = ResourceLimitInfinity
{-# LINE 101 "libraries/unix/System/Posix/Resource.hsc" #-}
unpackRLimit other
{-# LINE 103 "libraries/unix/System/Posix/Resource.hsc" #-}
| ((18446744073709551615) :: CRLim) /= (18446744073709551615) &&
{-# LINE 104 "libraries/unix/System/Posix/Resource.hsc" #-}
other == (18446744073709551615) = ResourceLimitUnknown
{-# LINE 105 "libraries/unix/System/Posix/Resource.hsc" #-}
{-# LINE 106 "libraries/unix/System/Posix/Resource.hsc" #-}
{-# LINE 107 "libraries/unix/System/Posix/Resource.hsc" #-}
| ((18446744073709551615) :: CRLim) /= (18446744073709551615) &&
{-# LINE 108 "libraries/unix/System/Posix/Resource.hsc" #-}
other == (18446744073709551615) = ResourceLimitUnknown
{-# LINE 109 "libraries/unix/System/Posix/Resource.hsc" #-}
{-# LINE 110 "libraries/unix/System/Posix/Resource.hsc" #-}
| otherwise = ResourceLimit (fromIntegral other)
packRLimit :: ResourceLimit -> Bool -> CRLim
packRLimit ResourceLimitInfinity _ = (18446744073709551615)
{-# LINE 114 "libraries/unix/System/Posix/Resource.hsc" #-}
{-# LINE 115 "libraries/unix/System/Posix/Resource.hsc" #-}
packRLimit ResourceLimitUnknown True = (18446744073709551615)
{-# LINE 116 "libraries/unix/System/Posix/Resource.hsc" #-}
{-# LINE 117 "libraries/unix/System/Posix/Resource.hsc" #-}
{-# LINE 118 "libraries/unix/System/Posix/Resource.hsc" #-}
packRLimit ResourceLimitUnknown False = (18446744073709551615)
{-# LINE 119 "libraries/unix/System/Posix/Resource.hsc" #-}
{-# LINE 120 "libraries/unix/System/Posix/Resource.hsc" #-}
packRLimit (ResourceLimit other) _ = fromIntegral other