{-# LINE 1 "src/System/Statgrab/Base.hsc" #-}
{-# LANGUAGE CPP                      #-}
{-# LINE 2 "src/System/Statgrab/Base.hsc" #-}
{-# LANGUAGE FlexibleContexts         #-}
{-# LANGUAGE FlexibleInstances        #-}
{-# LANGUAGE ForeignFunctionInterface #-}
{-# LANGUAGE RecordWildCards          #-}
{-# LANGUAGE TypeFamilies             #-}

-- Module      : System.Statgrab.Base
-- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
-- License     : This Source Code Form is subject to the terms of
--               the Mozilla Public License, v. 2.0.
--               A copy of the MPL can be found in the LICENSE file or
--               you can obtain it at http://mozilla.org/MPL/2.0/.
-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
-- Stability   : experimental
-- Portability : non-portable (GHC extensions)

-- | Bindings to the libstatgrab library.
module System.Statgrab.Base where

import Control.Applicative
import Data.ByteString          (packCString)
import Foreign
import Foreign.C.String
import Foreign.C.Types
import System.Statgrab.Internal

data family Struct a

-- | A wrapper around @Ptr a@ which keeps track of the result @Entries@,
-- needed for 'copyBatch'.
data PtrN a = PtrN
    { ptrUnwrap  :: Ptr a
    , ptrEntries :: !Int
    }

-- | Copy routines to marshall and unmarshall Storable @Stat a@ structures.
class Copy a where
    copyAt    :: Ptr  (Struct a) -> Int -> IO a
    copyBatch :: PtrN (Struct a) -> IO [a]
    copy      :: PtrN (Struct a) -> IO a

    copy      PtrN{..} = copyAt ptrUnwrap 0
    copyBatch PtrN{..} = mapM (copyAt ptrUnwrap) entries
      where
        entries
            | ptrEntries > 1 = [0..ptrEntries - 1]
            | otherwise      = [0]

    {-# MINIMAL copyAt    #-}
    {-# INLINE  copy      #-}
    {-# INLINE  copyBatch #-}

-- | Bracket routines for acquiring and releasing @Ptr a@s.
class Stat a where
    acquire :: Entries -> IO (Ptr a)
    release :: Ptr a   -> IO Error

-- | A wrapper for 'acquire'. This allows tracking the number of @Entries@
-- contained in a @Ptr a@.
acquireN :: Stat a => IO (PtrN a)
acquireN = alloca $ \x -> PtrN <$> acquire x <*> (fromIntegral <$> peek x)
{-# INLINE acquireN #-}

releaseN :: Stat a => PtrN a -> IO Error
releaseN = release . ptrUnwrap
{-# INLINE releaseN #-}

type ErrorDetailsPtr     = Ptr ErrorDetails
type HostPtr             = Ptr (Struct Host)
type CPUPtr              = Ptr (Struct CPU)
type CPUPercentPtr       = Ptr (Struct CPUPercent)
type MemoryPtr           = Ptr (Struct Memory)
type LoadPtr             = Ptr (Struct Load)
type UserPtr             = Ptr (Struct User)
type SwapPtr             = Ptr (Struct Swap)
type FileSystemPtr       = Ptr (Struct FileSystem)
type DiskIOPtr           = Ptr (Struct DiskIO)
type NetworkIOPtr        = Ptr (Struct NetworkIO)
type NetworkInterfacePtr = Ptr (Struct NetworkInterface)
type PagePtr             = Ptr (Struct Page)
type ProcessPtr          = Ptr (Struct Process)
type ProcessCountPtr     = Ptr (Struct ProcessCount)


{-# LINE 86 "src/System/Statgrab/Base.hsc" #-}


{-# LINE 88 "src/System/Statgrab/Base.hsc" #-}

errNone                :: Error
errNone                = Error 0
errAsPrintf            :: Error
errAsPrintf            = Error 2
errDevices             :: Error
errDevices             = Error 4
errDevStatGetDevs      :: Error
errDevStatGetDevs      = Error 5
errDevstat_selectdevs  :: Error
errDevstat_selectdevs  = Error 6
errDiskinfo            :: Error
errDiskinfo            = Error 7
errEnoent              :: Error
errEnoent              = Error 8
errGetifaddrs          :: Error
errGetifaddrs          = Error 9
errGetmountInfo        :: Error
errGetmountInfo        = Error 10
errGetPageSize         :: Error
errGetPageSize         = Error 11
errHost                :: Error
errHost                = Error 12
errKstatDataLookup     :: Error
errKstatDataLookup     = Error 13
errKstatLookup         :: Error
errKstatLookup         = Error 14
errKstatOpen           :: Error
errKstatOpen           = Error 15
errKstatRead           :: Error
errKstatRead           = Error 16
errKvmGetSwapInfo      :: Error
errKvmGetSwapInfo      = Error 17
errKvmOpenFiles        :: Error
errKvmOpenFiles        = Error 18
errMalloc              :: Error
errMalloc              = Error 19
errMemStatus           :: Error
errMemStatus           = Error 20
errOpen                :: Error
errOpen                = Error 21
errOpenDir             :: Error
errOpenDir             = Error 22
errParse               :: Error
errParse               = Error 24
errPdhAdd              :: Error
errPdhAdd              = Error 25
errPdhCollect          :: Error
errPdhCollect          = Error 26
errPdhOpen             :: Error
errPdhOpen             = Error 27
errPdhRead             :: Error
errPdhRead             = Error 28
errPermission          :: Error
errPermission          = Error 29
errPStat               :: Error
errPStat               = Error 30
errSetEGid             :: Error
errSetEGid             = Error 31
errSetEUid             :: Error
errSetEUid             = Error 32
errSetMntent           :: Error
errSetMntent           = Error 33
errSocket              :: Error
errSocket              = Error 34
errSwapCtl             :: Error
errSwapCtl             = Error 35
errSysConf             :: Error
errSysConf             = Error 36
errSysCtl              :: Error
errSysCtl              = Error 37
errSysCtlByName        :: Error
errSysCtlByName        = Error 38
errSysctlNameToMib     :: Error
errSysctlNameToMib     = Error 39
errUname               :: Error
errUname               = Error 43
errUnsupported         :: Error
errUnsupported         = Error 44
errXswVerMismatch      :: Error
errXswVerMismatch      = Error 45
errGetMsg              :: Error
errGetMsg              = Error 46
errPutMsg              :: Error
errPutMsg              = Error 47
errInitialisation      :: Error
errInitialisation      = Error 48
errMutexLock           :: Error
errMutexLock           = Error 49
errMutexUnlock         :: Error
errMutexUnlock         = Error 50

{-# LINE 136 "src/System/Statgrab/Base.hsc" #-}

data ErrorDetails = ErrorDetails
    { erError :: !Error
    , erValue :: !CInt
    , erArg   :: !CString
    }

foreign import ccall safe "statgrab.h sg_get_error"
     sg_get_error :: IO Error

foreign import ccall safe "statgrab.h sg_get_error_arg"
     sg_get_error_arg :: IO CString

foreign import ccall safe "statgrab.h sg_get_error_errno"
     sg_get_error_errno :: IO CInt

foreign import ccall safe "statgrab.h sg_get_error_details"
     sg_get_error_details :: ErrorDetailsPtr -> IO Error

foreign import ccall safe "statgrab.h sg_str_error"
     sg_str_error :: Error -> IO CString

foreign import ccall safe "statgrab.h sg_strperror"
     sg_strperror :: Ptr CString -> ErrorDetailsPtr -> IO CString

foreign import ccall safe "statgrab.h sg_init"
     sg_init :: CInt -> IO Error

foreign import ccall safe "statgrab.h sg_snapshot"
     sg_snapshot :: IO Error

foreign import ccall safe "statgrab.h sg_shutdown"
     sg_shutdown :: IO Error

foreign import ccall safe "statgrab.h sg_drop_privileges"
     sg_drop_privileges :: IO Error

foreign import ccall safe "statgrab.h sg_get_nelements"
     sg_get_nelements :: Ptr () -> IO CSize

foreign import ccall safe "statgrab.h sg_free_stats_buf"
     sg_free_stats_buf :: Ptr () -> IO Error

foreign import ccall safe "statgrab.h sg_lock_mutex"
     sg_lock_mutex :: CString -> IO Error

foreign import ccall safe "statgrab.h sg_unlock_mutex"
     sg_unlock_mutex :: CString -> IO Error

stateUnknownConfig    :: HostState
stateUnknownConfig    = HostState 0
statePhysicalHost     :: HostState
statePhysicalHost     = HostState 1
stateVirtual          :: HostState
stateVirtual          = HostState 2
stateParaVirtual      :: HostState
stateParaVirtual      = HostState 3
stateHardwareVirtual  :: HostState
stateHardwareVirtual  = HostState 4

{-# LINE 192 "src/System/Statgrab/Base.hsc" #-}

data instance Struct Host = CHost
    { hostOsName    :: !CString
    , hostOsRelease :: !CString
    , hostOsVersion :: !CString
    , hostPlatform  :: !CString
    , hostName      :: !CString
    , hostBitWidth  :: !CUInt
    , hostState     :: !HostState
    , hostNCPU      :: !CUInt
    , hostMaxCPU    :: !CUInt
    , hostUptime    :: !CTime
    , hostSystime   :: !CTime
    }

instance Copy Host where
    copyAt ptr i = do
        CHost{..} <- peekElemOff ptr i
        Host <$> packCString hostOsName
             <*> packCString hostOsRelease
             <*> packCString hostOsVersion
             <*> packCString hostPlatform
             <*> packCString hostName
             <#> hostBitWidth
             <!> hostState
             <#> hostNCPU
             <#> hostMaxCPU
             <@> hostUptime
             <@> hostSystime

instance Storable (Struct Host) where
    alignment _ = 8
{-# LINE 224 "src/System/Statgrab/Base.hsc" #-}
    sizeOf    _ = (72)
{-# LINE 225 "src/System/Statgrab/Base.hsc" #-}

    peek p = CHost
        <$> (\hsc_ptr -> peekByteOff hsc_ptr 0) p
{-# LINE 228 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 8) p
{-# LINE 229 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 16) p
{-# LINE 230 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 24) p
{-# LINE 231 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 32) p
{-# LINE 232 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 40) p
{-# LINE 233 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 44) p
{-# LINE 234 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 48) p
{-# LINE 235 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 52) p
{-# LINE 236 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 56) p
{-# LINE 237 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 64) p
{-# LINE 238 "src/System/Statgrab/Base.hsc" #-}

    poke p CHost{..} = do
        (\hsc_ptr -> pokeByteOff hsc_ptr 0) p hostOsName
{-# LINE 241 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 8) p hostOsRelease
{-# LINE 242 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 16) p hostOsVersion
{-# LINE 243 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 24) p hostPlatform
{-# LINE 244 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 32) p hostName
{-# LINE 245 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 40) p hostBitWidth
{-# LINE 246 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 44) p hostState
{-# LINE 247 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 48) p hostNCPU
{-# LINE 248 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 52) p hostMaxCPU
{-# LINE 249 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 56) p hostUptime
{-# LINE 250 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 64) p hostSystime
{-# LINE 251 "src/System/Statgrab/Base.hsc" #-}

instance Stat (Struct Host) where
    acquire = sg_get_host_info_r
    release = sg_free_host_info

foreign import ccall safe "statgrab.h sg_get_host_info"
    sg_get_host_info :: Entries -> IO HostPtr

foreign import ccall safe "statgrab.h sg_get_host_info_r"
    sg_get_host_info_r :: Entries -> IO HostPtr

foreign import ccall safe "statgrab.h sg_free_stats_buf"
    sg_free_host_info :: HostPtr -> IO Error

data instance Struct CPU = CCPU
    { cpuUser                   :: !CLLong
    , cpuKernel                 :: !CLLong
    , cpuIdle                   :: !CLLong
    , cpuIOWait                 :: !CLLong
    , cpuSwap                   :: !CLLong
    , cpuNice                   :: !CLLong
    , cpuTotal                  :: !CLLong
    , cpuCtxSwitches            :: !CLLong
    , cpuVoluntaryCtxSwitches   :: !CLLong
    , cpuInvoluntaryCtxSwitches :: !CLLong
    , cpuSyscalls               :: !CLLong
    , cpuInterrupts             :: !CLLong
    , cpuSoftInterrupts         :: !CLLong
    , cpuSystime                :: !CTime
    }

instance Copy CPU where
    copyAt ptr i = do
        CCPU{..} <- peekElemOff ptr i
        CPU <%> cpuUser
            <#> cpuKernel
            <#> cpuIdle
            <#> cpuIOWait
            <#> cpuSwap
            <#> cpuNice
            <#> cpuTotal
            <#> cpuCtxSwitches
            <#> cpuVoluntaryCtxSwitches
            <#> cpuInvoluntaryCtxSwitches
            <#> cpuSyscalls
            <#> cpuInterrupts
            <#> cpuSoftInterrupts
            <@> cpuSystime

instance Storable (Struct CPU) where
    alignment _ = 8
{-# LINE 302 "src/System/Statgrab/Base.hsc" #-}
    sizeOf    _ = (112)
{-# LINE 303 "src/System/Statgrab/Base.hsc" #-}

    peek p = CCPU
        <$> (\hsc_ptr -> peekByteOff hsc_ptr 0) p
{-# LINE 306 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 8) p
{-# LINE 307 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 16) p
{-# LINE 308 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 24) p
{-# LINE 309 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 32) p
{-# LINE 310 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 40) p
{-# LINE 311 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 48) p
{-# LINE 312 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 56) p
{-# LINE 313 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 64) p
{-# LINE 314 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 72) p
{-# LINE 315 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 80) p
{-# LINE 316 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 88) p
{-# LINE 317 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 96) p
{-# LINE 318 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 104) p
{-# LINE 319 "src/System/Statgrab/Base.hsc" #-}

    poke p CCPU{..} = do
        (\hsc_ptr -> pokeByteOff hsc_ptr 0) p cpuUser
{-# LINE 322 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 8) p cpuKernel
{-# LINE 323 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 16) p cpuIdle
{-# LINE 324 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 24) p cpuIOWait
{-# LINE 325 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 32) p cpuSwap
{-# LINE 326 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 40) p cpuNice
{-# LINE 327 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 48) p cpuTotal
{-# LINE 328 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 56) p cpuCtxSwitches
{-# LINE 329 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 64) p cpuVoluntaryCtxSwitches
{-# LINE 330 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 72) p cpuInvoluntaryCtxSwitches
{-# LINE 331 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 80) p cpuSyscalls
{-# LINE 332 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 88) p cpuInterrupts
{-# LINE 333 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 96) p cpuSoftInterrupts
{-# LINE 334 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 104) p cpuSystime
{-# LINE 335 "src/System/Statgrab/Base.hsc" #-}

instance Stat (Struct CPU) where
    acquire = sg_get_cpu_stats_r
    release = sg_free_cpu_stats

foreign import ccall safe "statgrab.h sg_get_cpu_stats"
    sg_get_cpu_stats :: Entries -> IO CPUPtr

foreign import ccall safe "statgrab.h sg_get_cpu_stats_diff"
    sg_get_cpu_stats_diff :: Entries -> IO CPUPtr

foreign import ccall safe "statgrab.h sg_get_cpu_stats_r"
    sg_get_cpu_stats_r :: Entries -> IO CPUPtr

foreign import ccall safe "statgrab.h sg_get_cpu_stats_diff_between"
    sg_get_cpu_stats_diff_between :: CPUPtr -> CPUPtr -> Entries -> IO CPUPtr

foreign import ccall safe "statgrab.h sg_free_stats_buf"
    sg_free_cpu_stats :: CPUPtr -> IO Error

data instance Struct CPUPercent = CCPUPercent
    { cpuPctUser      :: !CDouble
    , cpuPctKernel    :: !CDouble
    , cpuPctIdle      :: !CDouble
    , cpuPctIOWait    :: !CDouble
    , cpuPctSwap      :: !CDouble
    , cpuPctNice      :: !CDouble
    , cpuPctTimeTaken :: !CTime
    }

instance Copy CPUPercent where
    copyAt ptr i = do
        CCPUPercent{..} <- peekElemOff ptr i
        CPUPercent <$> pure (realToFrac cpuPctUser)
                   <@> cpuPctKernel
                   <@> cpuPctIdle
                   <@> cpuPctIOWait
                   <@> cpuPctSwap
                   <@> cpuPctNice
                   <@> cpuPctTimeTaken

instance Storable (Struct CPUPercent) where
    alignment _ = 8
{-# LINE 378 "src/System/Statgrab/Base.hsc" #-}
    sizeOf    _ = (56)
{-# LINE 379 "src/System/Statgrab/Base.hsc" #-}

    peek p = CCPUPercent
        <$> (\hsc_ptr -> peekByteOff hsc_ptr 0) p
{-# LINE 382 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 8) p
{-# LINE 383 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 16) p
{-# LINE 384 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 24) p
{-# LINE 385 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 32) p
{-# LINE 386 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 40) p
{-# LINE 387 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 48) p
{-# LINE 388 "src/System/Statgrab/Base.hsc" #-}

    poke p CCPUPercent{..} = do
        (\hsc_ptr -> pokeByteOff hsc_ptr 0) p cpuPctUser
{-# LINE 391 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 8) p cpuPctKernel
{-# LINE 392 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 16) p cpuPctIdle
{-# LINE 393 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 24) p cpuPctIOWait
{-# LINE 394 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 32) p cpuPctSwap
{-# LINE 395 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 40) p cpuPctNice
{-# LINE 396 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 48) p cpuPctTimeTaken
{-# LINE 397 "src/System/Statgrab/Base.hsc" #-}

sourceEntireCCPU  :: CPUPercentSource
sourceEntireCCPU  = CPUPercentSource 0
sourceDiffCCPU    :: CPUPercentSource
sourceDiffCCPU    = CPUPercentSource 1
sourceNewDiffCCPU :: CPUPercentSource
sourceNewDiffCCPU = CPUPercentSource 2

{-# LINE 403 "src/System/Statgrab/Base.hsc" #-}

foreign import ccall safe "statgrab.h sg_get_cpu_percents_of"
    sg_get_cpu_percents_of :: CPUPercentSource -> Entries -> IO CPUPercentPtr

foreign import ccall safe "statgrab.h sg_get_cpu_percents_r"
    sg_get_cpu_percents_r :: CPUPtr -> Entries -> IO CPUPercentPtr

foreign import ccall safe "statgrab.h sg_free_stats_buf"
    sg_free_cpu_percents :: CPUPercentPtr -> IO Error

data instance Struct Memory = CMemory
    { memTotal   :: !CULLong
    , memFree    :: !CULLong
    , memUsed    :: !CULLong
    , memCache   :: !CULLong
    , memSystime :: !CTime
    }

instance Copy Memory where
    copyAt ptr i = do
        CMemory{..} <- peekElemOff ptr i
        Memory <%> memTotal
               <#> memFree
               <#> memUsed
               <#> memCache
               <@> memSystime

instance Storable (Struct Memory) where
    alignment _ = 8
{-# LINE 432 "src/System/Statgrab/Base.hsc" #-}
    sizeOf    _ = (40)
{-# LINE 433 "src/System/Statgrab/Base.hsc" #-}

    peek p = CMemory
        <$> (\hsc_ptr -> peekByteOff hsc_ptr 0) p
{-# LINE 436 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 8) p
{-# LINE 437 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 16) p
{-# LINE 438 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 24) p
{-# LINE 439 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 32) p
{-# LINE 440 "src/System/Statgrab/Base.hsc" #-}

    poke p CMemory{..} = do
        (\hsc_ptr -> pokeByteOff hsc_ptr 0) p memTotal
{-# LINE 443 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 8) p memFree
{-# LINE 444 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 16) p memUsed
{-# LINE 445 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 32) p memSystime
{-# LINE 446 "src/System/Statgrab/Base.hsc" #-}

instance Stat (Struct Memory) where
    acquire = sg_get_mem_stats_r
    release = sg_free_mem_stats

foreign import ccall safe "statgrab.h sg_get_mem_stats"
    sg_get_mem_stats :: Entries -> IO MemoryPtr

foreign import ccall safe "statgrab.h sg_get_mem_stats_r"
    sg_get_mem_stats_r :: Entries -> IO MemoryPtr

foreign import ccall safe "statgrab.h sg_free_stats_buf"
    sg_free_mem_stats :: MemoryPtr -> IO Error

data instance Struct Load = CLoad
    { load1       :: !CDouble
    , load5       :: !CDouble
    , load15      :: !CDouble
    , loadSystime :: !CTime
    }

instance Copy Load where
    copyAt ptr i = do
        CLoad{..} <- peekElemOff ptr i
        Load <$> pure (realToFrac load1)
             <@> load5
             <@> load15
             <@> loadSystime

instance Storable (Struct Load) where
    alignment _ = 8
{-# LINE 477 "src/System/Statgrab/Base.hsc" #-}
    sizeOf    _ = (32)
{-# LINE 478 "src/System/Statgrab/Base.hsc" #-}

    peek p = CLoad
        <$> (\hsc_ptr -> peekByteOff hsc_ptr 0) p
{-# LINE 481 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 8) p
{-# LINE 482 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 16) p
{-# LINE 483 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 24) p
{-# LINE 484 "src/System/Statgrab/Base.hsc" #-}

    poke p CLoad{..} = do
        (\hsc_ptr -> pokeByteOff hsc_ptr 0) p load1
{-# LINE 487 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 8) p load5
{-# LINE 488 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 16) p load15
{-# LINE 489 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 24) p loadSystime
{-# LINE 490 "src/System/Statgrab/Base.hsc" #-}

instance Stat (Struct Load) where
    acquire = sg_get_load_stats_r
    release = sg_free_load_stats

foreign import ccall safe "statgrab.h sg_get_load_stats"
    sg_get_load_stats :: Entries -> IO LoadPtr

foreign import ccall safe "statgrab.h sg_get_load_stats_r"
    sg_get_load_stats_r :: Entries -> IO LoadPtr

foreign import ccall safe "statgrab.h sg_free_stats_buf"
    sg_free_load_stats :: LoadPtr -> IO Error

data instance Struct User = CUser
    { userLoginName    :: !CString
    , userRecordId     :: !CString
    , userRecordIdSize :: !CSize
    , userDevice       :: !CString
    , userHostName     :: !CString
    , userPid          :: !CInt
    , userLoginTime    :: !CTime
    , userSystime      :: !CTime
    }

instance Copy User where
    copyAt ptr i = do
        CUser{..} <- peekElemOff ptr i
        User <$> packCString userLoginName
             <*> packCString userRecordId
             <#> userRecordIdSize
             <*> packCString userDevice
             <*> packCString userHostName
             <#> userPid
             <@> userLoginTime
             <@> userSystime

instance Storable (Struct User) where
    alignment _ = 8
{-# LINE 529 "src/System/Statgrab/Base.hsc" #-}
    sizeOf    _ = (64)
{-# LINE 530 "src/System/Statgrab/Base.hsc" #-}

    peek p = CUser
        <$> (\hsc_ptr -> peekByteOff hsc_ptr 0) p
{-# LINE 533 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 8) p
{-# LINE 534 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 16) p
{-# LINE 535 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 24) p
{-# LINE 536 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 32) p
{-# LINE 537 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 40) p
{-# LINE 538 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 48) p
{-# LINE 539 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 56) p
{-# LINE 540 "src/System/Statgrab/Base.hsc" #-}

    poke p CUser{..} = do
        (\hsc_ptr -> pokeByteOff hsc_ptr 0) p userLoginTime
{-# LINE 543 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 8) p userRecordId
{-# LINE 544 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 16) p userRecordIdSize
{-# LINE 545 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 24) p userDevice
{-# LINE 546 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 32) p userHostName
{-# LINE 547 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 40) p userPid
{-# LINE 548 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 48) p userLoginTime
{-# LINE 549 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 56) p userSystime
{-# LINE 550 "src/System/Statgrab/Base.hsc" #-}

instance Stat (Struct User) where
    acquire = sg_get_user_stats_r
    release = sg_free_user_stats

foreign import ccall safe "statgrab.h sg_get_user_stats"
    sg_get_user_stats :: Entries -> IO UserPtr

foreign import ccall safe "statgrab.h sg_get_user_stats_r"
    sg_get_user_stats_r :: Entries -> IO UserPtr

foreign import ccall safe "statgrab.h sg_free_stats_buf"
    sg_free_user_stats :: UserPtr -> IO Error

data instance Struct Swap = CSwap
    { swapTotal   :: !CULLong
    , swapUsed    :: !CULLong
    , swapFree    :: !CULLong
    , swapSystime :: !CTime
    }

instance Copy Swap where
    copyAt ptr i = do
        CSwap{..} <- peekElemOff ptr i
        Swap <%> swapTotal
             <#> swapUsed
             <#> swapFree
             <@> swapSystime

instance Storable (Struct Swap) where
    alignment _ = 8
{-# LINE 581 "src/System/Statgrab/Base.hsc" #-}
    sizeOf    _ = (32)
{-# LINE 582 "src/System/Statgrab/Base.hsc" #-}

    peek p = CSwap
        <$> (\hsc_ptr -> peekByteOff hsc_ptr 0) p
{-# LINE 585 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 8) p
{-# LINE 586 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 16) p
{-# LINE 587 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 24) p
{-# LINE 588 "src/System/Statgrab/Base.hsc" #-}

    poke p CSwap{..} = do
        (\hsc_ptr -> pokeByteOff hsc_ptr 0) p swapTotal
{-# LINE 591 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 8) p swapUsed
{-# LINE 592 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 16) p swapFree
{-# LINE 593 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 24) p swapSystime
{-# LINE 594 "src/System/Statgrab/Base.hsc" #-}

instance Stat (Struct Swap) where
    acquire = sg_get_swap_stats_r
    release = sg_free_swap_stats

foreign import ccall safe "statgrab.h sg_get_swap_stats"
    sg_get_swap_stats :: Entries -> IO SwapPtr

foreign import ccall safe "statgrab.h sg_get_swap_stats_r"
    sg_get_swap_stats_r :: Entries -> IO SwapPtr

foreign import ccall safe "statgrab.h sg_free_stats_buf"
    sg_free_swap_stats :: SwapPtr -> IO Error

deviceUnknown   :: DeviceType
deviceUnknown   = DeviceType 0
deviceRegular   :: DeviceType
deviceRegular   = DeviceType 1
deviceSpecial   :: DeviceType
deviceSpecial   = DeviceType 2
deviceLoopback  :: DeviceType
deviceLoopback  = DeviceType 4
deviceRemote    :: DeviceType
deviceRemote    = DeviceType 8
deviceLocal     :: DeviceType
deviceLocal     = DeviceType 3
deviceAllTypes  :: DeviceType
deviceAllTypes  = DeviceType 15

{-# LINE 617 "src/System/Statgrab/Base.hsc" #-}

data instance Struct FileSystem = CFileSystem
    { fsDeviceName  :: !CString
    , fsType        :: !CString
    , fsMountPoint  :: !CString
    , fsDeviceType  :: !DeviceType
    , fsSize        :: !CULLong
    , fsUsed        :: !CULLong
    , fsFree        :: !CULLong
    , fsAvail       :: !CULLong
    , fsTotalInodes :: !CULLong
    , fsUsedInodes  :: !CULLong
    , fsFreeInodes  :: !CULLong
    , fsAvailInodes :: !CULLong
    , fsIOSize      :: !CULLong
    , fsBlockSize   :: !CULLong
    , fsTotalBlocks :: !CULLong
    , fsFreeBlocks  :: !CULLong
    , fsUsedBlocks  :: !CULLong
    , fsAvailBlocks :: !CULLong
    , fsSystime     :: !CTime
    }

instance Copy FileSystem where
    copyAt ptr i = do
        CFileSystem{..} <- peekElemOff ptr i
        FileSystem <$> packCString fsDeviceName
                   <*> packCString fsType
                   <*> packCString fsMountPoint
                   <!> fsDeviceType
                   <#> fsSize
                   <#> fsUsed
                   <#> fsFree
                   <#> fsAvail
                   <#> fsTotalInodes
                   <#> fsUsedInodes
                   <#> fsFreeInodes
                   <#> fsAvailInodes
                   <#> fsIOSize
                   <#> fsBlockSize
                   <#> fsTotalBlocks
                   <#> fsFreeBlocks
                   <#> fsUsedBlocks
                   <#> fsAvailBlocks
                   <@> fsSystime

instance Storable (Struct FileSystem) where
    alignment _ = 8
{-# LINE 665 "src/System/Statgrab/Base.hsc" #-}
    sizeOf    _ = (152)
{-# LINE 666 "src/System/Statgrab/Base.hsc" #-}

    peek p = CFileSystem
        <$> (\hsc_ptr -> peekByteOff hsc_ptr 0) p
{-# LINE 669 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 8) p
{-# LINE 670 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 16) p
{-# LINE 671 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 24) p
{-# LINE 672 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 32) p
{-# LINE 673 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 40) p
{-# LINE 674 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 48) p
{-# LINE 675 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 56) p
{-# LINE 676 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 64) p
{-# LINE 677 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 72) p
{-# LINE 678 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 80) p
{-# LINE 679 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 88) p
{-# LINE 680 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 96) p
{-# LINE 681 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 104) p
{-# LINE 682 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 112) p
{-# LINE 683 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 120) p
{-# LINE 684 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 128) p
{-# LINE 685 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 136) p
{-# LINE 686 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 144) p
{-# LINE 687 "src/System/Statgrab/Base.hsc" #-}

    poke p CFileSystem{..} = do
        (\hsc_ptr -> pokeByteOff hsc_ptr 0) p fsDeviceName
{-# LINE 690 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 8) p fsType
{-# LINE 691 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 16) p fsMountPoint
{-# LINE 692 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 24) p fsDeviceType
{-# LINE 693 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 32) p fsSize
{-# LINE 694 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 40) p fsUsed
{-# LINE 695 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 48) p fsFree
{-# LINE 696 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 56) p fsAvail
{-# LINE 697 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 64) p fsTotalInodes
{-# LINE 698 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 72) p fsUsedInodes
{-# LINE 699 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 80) p fsFreeInodes
{-# LINE 700 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 88) p fsAvailInodes
{-# LINE 701 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 96) p fsIOSize
{-# LINE 702 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 104) p fsBlockSize
{-# LINE 703 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 112) p fsTotalBlocks
{-# LINE 704 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 120) p fsFreeBlocks
{-# LINE 705 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 128) p fsUsedBlocks
{-# LINE 706 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 136) p fsAvailBlocks
{-# LINE 707 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 144) p fsSystime
{-# LINE 708 "src/System/Statgrab/Base.hsc" #-}

instance Stat (Struct FileSystem) where
    acquire = sg_get_fs_stats_r
    release = sg_free_fs_stats

foreign import ccall safe "statgrab.h sg_get_valid_filesystems"
     sg_get_valid_filesystems :: Entries -> IO (Ptr CString)

-- foreign import ccall safe "statgrab.h sg_get_fs_val"
--      sg_set_valid_filesystems :: Ptr CString -> IO Error
-- __sg_public const char **sg_get_valid_filesystems(size_t *entries);
-- __sg_public sg_error sg_set_valid_filesystems(const char *valid_fs[]);

foreign import ccall safe "statgrab.h sg_get_fs_stats"
     sg_get_fs_stats :: Entries -> IO FileSystemPtr

foreign import ccall safe "statgrab.h sg_get_fs_stats_r"
     sg_get_fs_stats_r :: Entries -> IO FileSystemPtr

foreign import ccall safe "statgrab.h sg_get_fs_stats_diff"
     sg_get_fs_stats_diff :: Entries -> IO FileSystemPtr

foreign import ccall safe "statgrab.h sg_get_fs_stats_diff_between"
     sg_get_fs_stats_diff_between :: FileSystemPtr
                                  -> FileSystemPtr
                                  -> Entries
                                  -> IO FileSystemPtr

foreign import ccall safe "statgrab.h sg_fs_compare_device_name"
     sg_fs_compare_device_name :: Ptr () -> Ptr () -> IO CInt

foreign import ccall safe "statgrab.h sg_fs_compare_mnt_point"
     sg_fs_compare_mnt_point :: Ptr () -> Ptr () -> IO CInt

foreign import ccall safe "statgrab.h sg_free_stats_buf"
    sg_free_fs_stats :: FileSystemPtr -> IO Error

data instance Struct DiskIO = CDiskIO
    { diskName    :: !CString
    , diskRead    :: !CULLong
    , diskWrite   :: !CULLong
    , diskSystime :: !CTime
    }

instance Copy DiskIO where
    copyAt ptr i = do
        CDiskIO{..} <- peekElemOff ptr i
        DiskIO <$> packCString diskName
               <#> diskRead
               <#> diskWrite
               <@> diskSystime

instance Storable (Struct DiskIO) where
    alignment _ = 8
{-# LINE 762 "src/System/Statgrab/Base.hsc" #-}
    sizeOf    _ = (32)
{-# LINE 763 "src/System/Statgrab/Base.hsc" #-}

    peek p = CDiskIO
        <$> (\hsc_ptr -> peekByteOff hsc_ptr 0) p
{-# LINE 766 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 8) p
{-# LINE 767 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 16) p
{-# LINE 768 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 24) p
{-# LINE 769 "src/System/Statgrab/Base.hsc" #-}

    poke p CDiskIO{..} = do
        (\hsc_ptr -> pokeByteOff hsc_ptr 0) p diskName
{-# LINE 772 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 8) p diskRead
{-# LINE 773 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 16) p diskWrite
{-# LINE 774 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 24) p diskSystime
{-# LINE 775 "src/System/Statgrab/Base.hsc" #-}

instance Stat (Struct DiskIO) where
    acquire = sg_get_disk_io_stats_r
    release = sg_free_disk_io_stats

foreign import ccall safe "statgrab.h sg_get_disk_io_stats"
    sg_get_disk_io_stats :: Entries -> IO DiskIOPtr

foreign import ccall safe "statgrab.h sg_get_disk_io_stats_r"
    sg_get_disk_io_stats_r :: Entries -> IO DiskIOPtr

foreign import ccall safe "statgrab.h sg_get_disk_io_stats_diff"
    sg_get_disk_io_stats_diff :: Entries -> IO DiskIOPtr

foreign import ccall safe "statgrab.h sg_get_disk_io_stats_diff_between"
    sg_get_disk_io_stats_diff_between :: DiskIOPtr
                                      -> DiskIOPtr
                                      -> Entries
                                      -> IO DiskIOPtr

foreign import ccall safe "statgrab.h sg_disk_io_compare_name"
    sg_disk_io_compare_name :: Ptr () -> Ptr () -> IO CInt

foreign import ccall safe "statgrab.h sg_disk_io_compare_traffic"
    sg_disk_io_compare_traffic :: Ptr () -> Ptr () -> IO CInt

foreign import ccall safe "statgrab.h sg_free_stats_buf"
    sg_free_disk_io_stats :: DiskIOPtr -> IO Error

data instance Struct NetworkIO = CNetworkIO
    { ifaceIOName     :: !CString
    , ifaceTX         :: !CULLong
    , ifaceRX         :: !CULLong
    , ifaceIPackets   :: !CULLong
    , ifaceOPackets   :: !CULLong
    , ifaceIErrors    :: !CULLong
    , ifaceOErrors    :: !CULLong
    , ifaceCollisions :: !CULLong
    , ifaceSystem     :: !CTime
    }

instance Copy NetworkIO where
    copyAt ptr i = do
        CNetworkIO{..} <- peekElemOff ptr i
        NetworkIO <$> packCString ifaceIOName
                  <#> ifaceTX
                  <#> ifaceRX
                  <#> ifaceIPackets
                  <#> ifaceOPackets
                  <#> ifaceIErrors
                  <#> ifaceOErrors
                  <#> ifaceCollisions
                  <@> ifaceSystem

instance Storable (Struct NetworkIO) where
    alignment _ = 8
{-# LINE 831 "src/System/Statgrab/Base.hsc" #-}
    sizeOf    _ = (72)
{-# LINE 832 "src/System/Statgrab/Base.hsc" #-}

    peek p = CNetworkIO
        <$> (\hsc_ptr -> peekByteOff hsc_ptr 0) p
{-# LINE 835 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 8) p
{-# LINE 836 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 16) p
{-# LINE 837 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 24) p
{-# LINE 838 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 32) p
{-# LINE 839 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 40) p
{-# LINE 840 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 48) p
{-# LINE 841 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 56) p
{-# LINE 842 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 64) p
{-# LINE 843 "src/System/Statgrab/Base.hsc" #-}

    poke p CNetworkIO{..} = do
        (\hsc_ptr -> pokeByteOff hsc_ptr 0) p ifaceIOName
{-# LINE 846 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 8) p ifaceTX
{-# LINE 847 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 16) p ifaceRX
{-# LINE 848 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 24) p ifaceIPackets
{-# LINE 849 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 32) p ifaceOPackets
{-# LINE 850 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 40) p ifaceIErrors
{-# LINE 851 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 48) p ifaceOErrors
{-# LINE 852 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 56) p ifaceCollisions
{-# LINE 853 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 64) p ifaceSystem
{-# LINE 854 "src/System/Statgrab/Base.hsc" #-}

instance Stat (Struct NetworkIO) where
    acquire = sg_get_network_io_stats_r
    release = sg_free_network_io_stats

foreign import ccall safe "statgrab.h sg_get_network_io_stats"
     sg_get_network_io_stats :: Entries -> IO NetworkIOPtr

foreign import ccall safe "statgrab.h sg_get_network_io_stats_r"
     sg_get_network_io_stats_r :: Entries -> IO NetworkIOPtr

foreign import ccall safe "statgrab.h sg_get_network_io_stats_diff"
     sg_get_network_io_stats_diff :: Entries -> IO NetworkIOPtr

foreign import ccall safe "statgrab.h sg_get_network_io_stats_diff_between"
     sg_get_network_io_stats_diff_between :: NetworkIOPtr
                                          -> NetworkIOPtr
                                          -> Entries
                                          -> IO NetworkIOPtr

foreign import ccall safe "statgrab.h sg_network_io_compare_name"
     sg_network_io_compare_name :: Ptr () -> Ptr () -> IO (CInt)

foreign import ccall safe "statgrab.h sg_free_stats_buf"
    sg_free_network_io_stats :: NetworkIOPtr -> IO Error

duplexFull     :: InterfaceMode
duplexFull     = InterfaceMode 0
duplexHalf     :: InterfaceMode
duplexHalf     = InterfaceMode 1
duplexUnknown  :: InterfaceMode
duplexUnknown  = InterfaceMode 2

{-# LINE 885 "src/System/Statgrab/Base.hsc" #-}

statusDown  :: InterfaceStatus
statusDown  = InterfaceStatus 0
statusUp    :: InterfaceStatus
statusUp    = InterfaceStatus 1

{-# LINE 890 "src/System/Statgrab/Base.hsc" #-}

data instance Struct NetworkInterface = CNetworkInterface
    { ifaceName    :: !CString
    , ifaceSpeed   :: !CULLong
    , ifaceFactor  :: !CULLong
    , ifaceDuplex  :: !InterfaceMode
    , ifaceUp      :: !InterfaceStatus
    , ifaceSystime :: !CTime
    }

instance Copy NetworkInterface where
    copyAt ptr i = do
        CNetworkInterface{..} <- peekElemOff ptr i
        NetworkInterface <$> packCString ifaceName
                         <#> ifaceSpeed
                         <#> ifaceFactor
                         <!> ifaceDuplex
                         <!> ifaceUp
                         <@> ifaceSystime

instance Storable (Struct NetworkInterface) where
    alignment _ = 8
{-# LINE 912 "src/System/Statgrab/Base.hsc" #-}
    sizeOf    _ = (40)
{-# LINE 913 "src/System/Statgrab/Base.hsc" #-}

    peek p = CNetworkInterface
        <$> (\hsc_ptr -> peekByteOff hsc_ptr 0) p
{-# LINE 916 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 8) p
{-# LINE 917 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 16) p
{-# LINE 918 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 24) p
{-# LINE 919 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 28) p
{-# LINE 920 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 32) p
{-# LINE 921 "src/System/Statgrab/Base.hsc" #-}

    poke p CNetworkInterface{..} = do
        (\hsc_ptr -> pokeByteOff hsc_ptr 0) p ifaceName
{-# LINE 924 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 8) p ifaceSpeed
{-# LINE 925 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 16) p ifaceFactor
{-# LINE 926 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 24) p ifaceDuplex
{-# LINE 927 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 28) p ifaceUp
{-# LINE 928 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 32) p ifaceSystime
{-# LINE 929 "src/System/Statgrab/Base.hsc" #-}

instance Stat (Struct NetworkInterface) where
    acquire = sg_get_network_iface_stats_r
    release = sg_free_network_iface_stats

foreign import ccall safe "statgrab.h sg_get_network_iface_stats"
    sg_get_network_iface_stats :: Entries -> IO NetworkInterfacePtr

foreign import ccall safe "statgrab.h sg_get_network_iface_stats_r"
    sg_get_network_iface_stats_r :: Entries -> IO NetworkInterfacePtr

foreign import ccall safe "statgrab.h sg_network_iface_compare_name"
    sg_network_iface_compare_name :: Ptr () -> Ptr () -> IO CInt

foreign import ccall safe "statgrab.h sg_free_stats_buf"
    sg_free_network_iface_stats :: NetworkInterfacePtr -> IO Error

data instance Struct Page = CPage
    { pagesIn      :: !CULLong
    , pagesOut     :: !CULLong
    , pagesSysTime :: !CTime
    }

instance Copy Page where
    copyAt ptr i = do
        CPage{..} <- peekElemOff ptr i
        Page <%> pagesIn
             <#> pagesOut
             <@> pagesSysTime

instance Storable (Struct Page) where
    alignment _ = 8
{-# LINE 961 "src/System/Statgrab/Base.hsc" #-}
    sizeOf    _ = (24)
{-# LINE 962 "src/System/Statgrab/Base.hsc" #-}

    peek p = CPage
        <$> (\hsc_ptr -> peekByteOff hsc_ptr 0) p
{-# LINE 965 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 8) p
{-# LINE 966 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 16) p
{-# LINE 967 "src/System/Statgrab/Base.hsc" #-}

    poke p CPage{..} = do
        (\hsc_ptr -> pokeByteOff hsc_ptr 0) p pagesIn
{-# LINE 970 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 8) p pagesOut
{-# LINE 971 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 16) p pagesSysTime
{-# LINE 972 "src/System/Statgrab/Base.hsc" #-}

instance Stat (Struct Page) where
    acquire = sg_get_page_stats_r
    release = sg_free_page_stats

foreign import ccall safe "statgrab.h sg_get_page_stats"
     sg_get_page_stats :: Entries -> IO PagePtr

foreign import ccall safe "statgrab.h sg_get_page_stats_r"
     sg_get_page_stats_r :: Entries -> IO PagePtr

foreign import ccall safe "statgrab.h sg_get_page_stats_diff"
     sg_get_page_stats_diff :: Entries -> IO PagePtr

foreign import ccall safe "statgrab.h sg_get_page_stats_diff_between"
     sg_get_page_stats_diff_between :: PagePtr
                                    -> PagePtr
                                    -> Entries
                                    -> IO PagePtr

foreign import ccall safe "statgrab.h sg_free_stats_buf"
    sg_free_page_stats :: PagePtr -> IO Error

stateRunning   :: ProcessState
stateRunning   = ProcessState 0
stateSleeping  :: ProcessState
stateSleeping  = ProcessState 1
stateStopped   :: ProcessState
stateStopped   = ProcessState 2
stateZombie    :: ProcessState
stateZombie    = ProcessState 3
stateUnknown   :: ProcessState
stateUnknown   = ProcessState 4

{-# LINE 1002 "src/System/Statgrab/Base.hsc" #-}

data instance Struct Process = CProcess
    { procName        :: !CString
    , procTitle       :: !CString
    , procPid         :: !CInt
    , procParent      :: !CInt
    , procPGid        :: !CInt
    , procSessId      :: !CInt
    , procUid         :: !CUInt
    , procEUid        :: !CUInt
    , procGid         :: !CUInt
    , procEGid        :: !CUInt
    , procSwitches    :: !CULLong
    , procVoluntary   :: !CULLong
    , procInvoluntary :: !CULLong
    , procSize        :: !CULLong
    , procResident    :: !CULLong
    , procStart       :: !CTime
    , procSpent       :: !CTime
    , procCPUPercent  :: !CDouble
    , procNice        :: !CInt
    , procState       :: !ProcessState
    , procSystime     :: !CTime
    }

instance Copy Process where
    copyAt ptr i = do
        CProcess{..} <- peekElemOff ptr i
        Process <$> packCString procName
                <*> packCString procTitle
                <#> procPid
                <#> procParent
                <#> procPGid
                <#> procSessId
                <#> procUid
                <#> procEUid
                <#> procGid
                <#> procEGid
                <#> procSwitches
                <#> procVoluntary
                <#> procInvoluntary
                <#> procSize
                <#> procResident
                <@> procStart
                <@> procSpent
                <@> procCPUPercent
                <#> procNice
                <!> procState
                <@> procSystime

instance Storable (Struct Process) where
    alignment _ = 8
{-# LINE 1054 "src/System/Statgrab/Base.hsc" #-}
    sizeOf    _ = (128)
{-# LINE 1055 "src/System/Statgrab/Base.hsc" #-}

    peek p = CProcess
        <$> (\hsc_ptr -> peekByteOff hsc_ptr 0) p
{-# LINE 1058 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 8) p
{-# LINE 1059 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 16) p
{-# LINE 1060 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 20) p
{-# LINE 1061 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 24) p
{-# LINE 1062 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 28) p
{-# LINE 1063 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 32) p
{-# LINE 1064 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 36) p
{-# LINE 1065 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 40) p
{-# LINE 1066 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 44) p
{-# LINE 1067 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 48) p
{-# LINE 1068 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 56) p
{-# LINE 1069 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 64) p
{-# LINE 1070 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 72) p
{-# LINE 1071 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 80) p
{-# LINE 1072 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 88) p
{-# LINE 1073 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 96) p
{-# LINE 1074 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 104) p
{-# LINE 1075 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 112) p
{-# LINE 1076 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 116) p
{-# LINE 1077 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 120) p
{-# LINE 1078 "src/System/Statgrab/Base.hsc" #-}

    poke p CProcess{..} = do
        (\hsc_ptr -> pokeByteOff hsc_ptr 0) p procName
{-# LINE 1081 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 8) p procTitle
{-# LINE 1082 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 16) p procPid
{-# LINE 1083 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 20) p procParent
{-# LINE 1084 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 24) p procPGid
{-# LINE 1085 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 28) p procSessId
{-# LINE 1086 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 32) p procUid
{-# LINE 1087 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 36) p procEUid
{-# LINE 1088 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 40) p procGid
{-# LINE 1089 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 44) p procEGid
{-# LINE 1090 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 48) p procSwitches
{-# LINE 1091 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 56) p procVoluntary
{-# LINE 1092 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 64) p procInvoluntary
{-# LINE 1093 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 72) p procSize
{-# LINE 1094 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 80) p procResident
{-# LINE 1095 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 88) p procStart
{-# LINE 1096 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 96) p procSpent
{-# LINE 1097 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 104) p procCPUPercent
{-# LINE 1098 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 112) p procNice
{-# LINE 1099 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 116) p procState
{-# LINE 1100 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 120) p procSystime
{-# LINE 1101 "src/System/Statgrab/Base.hsc" #-}

instance Stat (Struct Process) where
    acquire = sg_get_process_stats_r
    release = sg_free_process_stats

foreign import ccall safe "statgrab.h sg_get_process_stats"
    sg_get_process_stats :: Entries -> IO ProcessPtr

foreign import ccall safe "statgrab.h sg_get_process_stats_r"
    sg_get_process_stats_r :: Entries -> IO ProcessPtr

foreign import ccall safe "statgrab.h sg_process_compare_name"
    sg_process_compare_name :: Ptr () -> Ptr () -> IO CInt

foreign import ccall safe "statgrab.h sg_process_compare_pid"
    sg_process_compare_pid :: Ptr () -> Ptr () -> IO CInt

foreign import ccall safe "statgrab.h sg_process_compare_uid"
    sg_process_compare_uid :: Ptr () -> Ptr () -> IO CInt

foreign import ccall safe "statgrab.h sg_process_compare_gid"
    sg_process_compare_gid :: Ptr () -> Ptr () -> IO CInt

foreign import ccall safe "statgrab.h sg_process_compare_size"
    sg_process_compare_size :: Ptr () -> Ptr () -> IO CInt

foreign import ccall safe "statgrab.h sg_process_compare_res"
    sg_process_compare_res :: Ptr () -> Ptr () -> IO CInt

foreign import ccall safe "statgrab.h sg_process_compare_cpu"
    sg_process_compare_cpu :: Ptr () -> Ptr () -> IO CInt

foreign import ccall safe "statgrab.h sg_process_compare_time"
    sg_process_compare_time :: Ptr () -> Ptr () -> IO CInt

foreign import ccall safe "statgrab.h sg_free_stats_buf"
    sg_free_process_stats :: ProcessPtr -> IO Error

sourceEntire  :: ProcessSource
sourceEntire  = ProcessSource 0
sourceLast    :: ProcessSource
sourceLast    = ProcessSource 1

{-# LINE 1143 "src/System/Statgrab/Base.hsc" #-}

data instance Struct ProcessCount = CProcessCount
    { countTotal    :: !CULLong
    , countRunning  :: !CULLong
    , countSleeping :: !CULLong
    , countStopped  :: !CULLong
    , countZombie   :: !CULLong
    , countUnknown  :: !CULLong
    , countSystime  :: !CTime
    }

instance Copy ProcessCount where
    copyAt ptr i = do
        CProcessCount{..} <- peekElemOff ptr i
        ProcessCount <%> countTotal
                     <#> countRunning
                     <#> countSleeping
                     <#> countStopped
                     <#> countZombie
                     <#> countUnknown
                     <@> countSystime

instance Storable (Struct ProcessCount) where
    alignment _ = 8
{-# LINE 1167 "src/System/Statgrab/Base.hsc" #-}
    sizeOf    _ = (56)
{-# LINE 1168 "src/System/Statgrab/Base.hsc" #-}

    peek p = CProcessCount
        <$> (\hsc_ptr -> peekByteOff hsc_ptr 0) p
{-# LINE 1171 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 8) p
{-# LINE 1172 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 16) p
{-# LINE 1173 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 24) p
{-# LINE 1174 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 32) p
{-# LINE 1175 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 40) p
{-# LINE 1176 "src/System/Statgrab/Base.hsc" #-}
        <*> (\hsc_ptr -> peekByteOff hsc_ptr 48) p
{-# LINE 1177 "src/System/Statgrab/Base.hsc" #-}

    poke p CProcessCount{..} = do
        (\hsc_ptr -> pokeByteOff hsc_ptr 0) p countTotal
{-# LINE 1180 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 8) p countRunning
{-# LINE 1181 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 16) p countSleeping
{-# LINE 1182 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 24) p countStopped
{-# LINE 1183 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 32) p countZombie
{-# LINE 1184 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 40) p countUnknown
{-# LINE 1185 "src/System/Statgrab/Base.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 48) p countSystime
{-# LINE 1186 "src/System/Statgrab/Base.hsc" #-}

foreign import ccall safe "statgrab.h sg_get_process_count_of"
    sg_get_process_count_of :: ProcessSource -> IO ProcessCountPtr

foreign import ccall safe "statgrab.h sg_get_process_count_r"
    sg_get_process_count_r :: ProcessPtr -> IO ProcessCountPtr

foreign import ccall safe "statgrab.h sg_free_stats_buf"
    sg_free_process_count :: ProcessCountPtr -> IO Error