module System.Mesos.Raw.PerformanceStatistics where
import           System.Mesos.Internal

type PerformanceStatisticsPtr = Ptr PerformanceStatistics

foreign import ccall unsafe "ext/types.h toPerfStatistics" c_toPerfStatistics
  :: CDouble -- ^ timestamp
  -> CDouble -- ^ duration
  -> (Ptr CULong) -- ^ cycles
  -> (Ptr CULong) -- ^ stalledCyclesFrontend
  -> (Ptr CULong) -- ^ stalledCyclesBackend
  -> (Ptr CULong) -- ^ instructions
  -> (Ptr CULong) -- ^ cacheReferences
  -> (Ptr CULong) -- ^ cacheMisses
  -> (Ptr CULong) -- ^ branches
  -> (Ptr CULong) -- ^ branchMisses
  -> (Ptr CULong) -- ^ busCycles
  -> (Ptr CULong) -- ^ refCycles
  -> (Ptr CDouble) -- ^ cpuClock
  -> (Ptr CDouble) -- ^ taskClock
  -> (Ptr CULong) -- ^ pageFaults
  -> (Ptr CULong) -- ^ minorFaults
  -> (Ptr CULong) -- ^ majorFaults
  -> (Ptr CULong) -- ^ contextSwitches
  -> (Ptr CULong) -- ^ cpuMigrations
  -> (Ptr CULong) -- ^ alignmentFaults
  -> (Ptr CULong) -- ^ emulationFaults
  -> (Ptr CULong) -- ^ l1DcacheLoads
  -> (Ptr CULong) -- ^ l1DcacheLoadMisses
  -> (Ptr CULong) -- ^ l1DcacheStores
  -> (Ptr CULong) -- ^ l1DcacheStoreMisses
  -> (Ptr CULong) -- ^ l1DcachePrefetches
  -> (Ptr CULong) -- ^ l1DcachePrefetchMisses
  -> (Ptr CULong) -- ^ l1IcacheLoads
  -> (Ptr CULong) -- ^ l1IcacheLoadMisses
  -> (Ptr CULong) -- ^ l1IcachePrefetches
  -> (Ptr CULong) -- ^ l1IcachePrefetchMisses
  -> (Ptr CULong) -- ^ llcLoads
  -> (Ptr CULong) -- ^ llcLoadMisses
  -> (Ptr CULong) -- ^ llcStores
  -> (Ptr CULong) -- ^ llcStoreMisses
  -> (Ptr CULong) -- ^ llcPrefetches
  -> (Ptr CULong) -- ^ llcPrefetchMisses
  -> (Ptr CULong) -- ^ dtlbLoads
  -> (Ptr CULong) -- ^ dtlbLoadMisses
  -> (Ptr CULong) -- ^ dtlbStores
  -> (Ptr CULong) -- ^ dtlbStoreMisses
  -> (Ptr CULong) -- ^ dtlbPrefetches
  -> (Ptr CULong) -- ^ dtlbPrefetchMisses
  -> (Ptr CULong) -- ^ itlbLoads
  -> (Ptr CULong) -- ^ itlbLoadMisses
  -> (Ptr CULong) -- ^ branchLoads
  -> (Ptr CULong) -- ^ branchLoadMisses
  -> (Ptr CULong) -- ^ nodeLoads
  -> (Ptr CULong) -- ^ nodeLoadMisses
  -> (Ptr CULong) -- ^ nodeStores
  -> (Ptr CULong) -- ^ nodeStoreMisses
  -> (Ptr CULong) -- ^ nodePrefetches
  -> (Ptr CULong) -- ^ nodePrefetchMisses
  -> IO PerformanceStatisticsPtr

foreign import ccall unsafe "ext/types.h fromPerfStatistics" c_fromPerfStatistics
  :: PerformanceStatisticsPtr
  -> (Ptr CDouble) -- ^ timestamp
  -> (Ptr CDouble) -- ^ duration
  -> (Ptr CULong) -- ^ cycles
  -> (Ptr CBool) -- ^ cyclesSet
  -> (Ptr CULong) -- ^ stalledCyclesFrontend
  -> (Ptr CBool) -- ^ stalledCyclesFrontendSet
  -> (Ptr CULong) -- ^ stalledCyclesBackend
  -> (Ptr CBool) -- ^ stalledCyclesBackendSet
  -> (Ptr CULong) -- ^ instructions
  -> (Ptr CBool) -- ^ instructionsSet
  -> (Ptr CULong) -- ^ cacheReferences
  -> (Ptr CBool) -- ^ cacheReferencesSet
  -> (Ptr CULong) -- ^ cacheMisses
  -> (Ptr CBool) -- ^ cacheMissesSet
  -> (Ptr CULong) -- ^ branches
  -> (Ptr CBool) -- ^ branchesSet
  -> (Ptr CULong) -- ^ branchMisses
  -> (Ptr CBool) -- ^ branchMissesSet
  -> (Ptr CULong) -- ^ busCycles
  -> (Ptr CBool) -- ^ busCyclesSet
  -> (Ptr CULong) -- ^ refCycles
  -> (Ptr CBool) -- ^ refCyclesSet
  -> (Ptr CDouble) -- ^ cpuClock
  -> (Ptr CBool) -- ^ cpuClockSet
  -> (Ptr CDouble) -- ^ taskClock
  -> (Ptr CBool) -- ^ taskClockSet
  -> (Ptr CULong) -- ^ pageFaults
  -> (Ptr CBool) -- ^ pageFaultsSet
  -> (Ptr CULong) -- ^ minorFaults
  -> (Ptr CBool) -- ^ minorFaultsSet
  -> (Ptr CULong) -- ^ majorFaults
  -> (Ptr CBool) -- ^ majorFaultsSet
  -> (Ptr CULong) -- ^ contextSwitches
  -> (Ptr CBool) -- ^ contextSwitchesSet
  -> (Ptr CULong) -- ^ cpuMigrations
  -> (Ptr CBool) -- ^ cpuMigrationsSet
  -> (Ptr CULong) -- ^ alignmentFaults
  -> (Ptr CBool) -- ^ alignmentFaultsSet
  -> (Ptr CULong) -- ^ emulationFaults
  -> (Ptr CBool) -- ^ emulationFaultsSet
  -> (Ptr CULong) -- ^ l1DcacheLoads
  -> (Ptr CBool) -- ^ l1DcacheLoadsSet
  -> (Ptr CULong) -- ^ l1DcacheLoadMisses
  -> (Ptr CBool) -- ^ l1DcacheLoadMissesSet
  -> (Ptr CULong) -- ^ l1DcacheStores
  -> (Ptr CBool) -- ^ l1DcacheStoresSet
  -> (Ptr CULong) -- ^ l1DcacheStoreMisses
  -> (Ptr CBool) -- ^ l1DcacheStoreMissesSet
  -> (Ptr CULong) -- ^ l1DcachePrefetches
  -> (Ptr CBool) -- ^ l1DcachePrefetchesSet
  -> (Ptr CULong) -- ^ l1DcachePrefetchMisses
  -> (Ptr CBool) -- ^ l1DcachePrefetchMissesSet
  -> (Ptr CULong) -- ^ l1IcacheLoads
  -> (Ptr CBool) -- ^ l1IcacheLoadsSet
  -> (Ptr CULong) -- ^ l1IcacheLoadMisses
  -> (Ptr CBool) -- ^ l1IcacheLoadMissesSet
  -> (Ptr CULong) -- ^ l1IcachePrefetches
  -> (Ptr CBool) -- ^ l1IcachePrefetchesSet
  -> (Ptr CULong) -- ^ l1IcachePrefetchMisses
  -> (Ptr CBool) -- ^ l1IcachePrefetchMissesSet
  -> (Ptr CULong) -- ^ llcLoads
  -> (Ptr CBool) -- ^ llcLoadsSet
  -> (Ptr CULong) -- ^ llcLoadMisses
  -> (Ptr CBool) -- ^ llcLoadMissesSet
  -> (Ptr CULong) -- ^ llcStores
  -> (Ptr CBool) -- ^ llcStoresSet
  -> (Ptr CULong) -- ^ llcStoreMisses
  -> (Ptr CBool) -- ^ llcStoreMissesSet
  -> (Ptr CULong) -- ^ llcPrefetches
  -> (Ptr CBool) -- ^ llcPrefetchesSet
  -> (Ptr CULong) -- ^ llcPrefetchMisses
  -> (Ptr CBool) -- ^ llcPrefetchMissesSet
  -> (Ptr CULong) -- ^ dtlbLoads
  -> (Ptr CBool) -- ^ dtlbLoadsSet
  -> (Ptr CULong) -- ^ dtlbLoadMisses
  -> (Ptr CBool) -- ^ dtlbLoadMissesSet
  -> (Ptr CULong) -- ^ dtlbStores
  -> (Ptr CBool) -- ^ dtlbStoresSet
  -> (Ptr CULong) -- ^ dtlbStoreMisses
  -> (Ptr CBool) -- ^ dtlbStoreMissesSet
  -> (Ptr CULong) -- ^ dtlbPrefetches
  -> (Ptr CBool) -- ^ dtlbPrefetchesSet
  -> (Ptr CULong) -- ^ dtlbPrefetchMisses
  -> (Ptr CBool) -- ^ dtlbPrefetchMissesSet
  -> (Ptr CULong) -- ^ itlbLoads
  -> (Ptr CBool) -- ^ itlbLoadsSet
  -> (Ptr CULong) -- ^ itlbLoadMisses
  -> (Ptr CBool) -- ^ itlbLoadMissesSet
  -> (Ptr CULong) -- ^ branchLoads
  -> (Ptr CBool) -- ^ branchLoadsSet
  -> (Ptr CULong) -- ^ branchLoadMisses
  -> (Ptr CBool) -- ^ branchLoadMissesSet
  -> (Ptr CULong) -- ^ nodeLoads
  -> (Ptr CBool) -- ^ nodeLoadsSet
  -> (Ptr CULong) -- ^ nodeLoadMisses
  -> (Ptr CBool) -- ^ nodeLoadMissesSet
  -> (Ptr CULong) -- ^ nodeStores
  -> (Ptr CBool) -- ^ nodeStoresSet
  -> (Ptr CULong) -- ^ nodeStoreMisses
  -> (Ptr CBool) -- ^ nodeStoreMissesSet
  -> (Ptr CULong) -- ^ nodePrefetches
  -> (Ptr CBool) -- ^ nodePrefetchesSet
  -> (Ptr CULong) -- ^ nodePrefetchMisses
  -> (Ptr CBool) -- ^ nodePrefetchMissesSet
  -> IO ()

foreign import ccall unsafe "ext/types.h destroyPerfStatistics" c_destroyPerfStatistics
  :: PerformanceStatisticsPtr -> IO ()

instance CPPValue PerformanceStatistics where
  marshal x = do
    cyclesP <- allocMaybe $ fmap CULong $ performanceStatisticsCycles x
    stalledCyclesFrontendP <- allocMaybe $ fmap CULong $ performanceStatisticsStalledCyclesFrontend x
    stalledCyclesBackendP <- allocMaybe $ fmap CULong $ performanceStatisticsStalledCyclesBackend x
    instructionsP <- allocMaybe $ fmap CULong $ performanceStatisticsInstructions x
    cacheReferencesP <- allocMaybe $ fmap CULong $ performanceStatisticsCacheReferences x
    cacheMissesP <- allocMaybe $ fmap CULong $ performanceStatisticsCacheMisses x
    branchesP <- allocMaybe $ fmap CULong $ performanceStatisticsBranches x
    branchMissesP <- allocMaybe $ fmap CULong $ performanceStatisticsBranchMisses x
    busCyclesP <- allocMaybe $ fmap CULong $ performanceStatisticsBusCycles x
    refCyclesP <- allocMaybe $ fmap CULong $ performanceStatisticsRefCycles x
    cpuClockP <- allocMaybe $ fmap CDouble $ performanceStatisticsCpuClock x
    taskClockP <- allocMaybe $ fmap CDouble $ performanceStatisticsTaskClock x
    pageFaultsP <- allocMaybe $ fmap CULong $ performanceStatisticsPageFaults x
    minorFaultsP <- allocMaybe $ fmap CULong $ performanceStatisticsMinorFaults x
    majorFaultsP <- allocMaybe $ fmap CULong $ performanceStatisticsMajorFaults x
    contextSwitchesP <- allocMaybe $ fmap CULong $ performanceStatisticsContextSwitches x
    cpuMigrationsP <- allocMaybe $ fmap CULong $ performanceStatisticsCpuMigrations x
    alignmentFaultsP <- allocMaybe $ fmap CULong $ performanceStatisticsAlignmentFaults x
    emulationFaultsP <- allocMaybe $ fmap CULong $ performanceStatisticsEmulationFaults x
    l1DcacheLoadsP <- allocMaybe $ fmap CULong $ performanceStatisticsL1DcacheLoads x
    l1DcacheLoadMissesP <- allocMaybe $ fmap CULong $ performanceStatisticsL1DcacheLoadMisses x
    l1DcacheStoresP <- allocMaybe $ fmap CULong $ performanceStatisticsL1DcacheStores x
    l1DcacheStoreMissesP <- allocMaybe $ fmap CULong $ performanceStatisticsL1DcacheStoreMisses x
    l1DcachePrefetchesP <- allocMaybe $ fmap CULong $ performanceStatisticsL1DcachePrefetches x
    l1DcachePrefetchMissesP <- allocMaybe $ fmap CULong $ performanceStatisticsL1DcachePrefetchMisses x
    l1IcacheLoadsP <- allocMaybe $ fmap CULong $ performanceStatisticsL1IcacheLoads x
    l1IcacheLoadMissesP <- allocMaybe $ fmap CULong $ performanceStatisticsL1IcacheLoadMisses x
    l1IcachePrefetchesP <- allocMaybe $ fmap CULong $ performanceStatisticsL1IcachePrefetches x
    l1IcachePrefetchMissesP <- allocMaybe $ fmap CULong $ performanceStatisticsL1IcachePrefetchMisses x
    llcLoadsP <- allocMaybe $ fmap CULong $ performanceStatisticsLlcLoads x
    llcLoadMissesP <- allocMaybe $ fmap CULong $ performanceStatisticsLlcLoadMisses x
    llcStoresP <- allocMaybe $ fmap CULong $ performanceStatisticsLlcStores x
    llcStoreMissesP <- allocMaybe $ fmap CULong $ performanceStatisticsLlcStoreMisses x
    llcPrefetchesP <- allocMaybe $ fmap CULong $ performanceStatisticsLlcPrefetches x
    llcPrefetchMissesP <- allocMaybe $ fmap CULong $ performanceStatisticsLlcPrefetchMisses x
    dtlbLoadsP <- allocMaybe $ fmap CULong $ performanceStatisticsDtlbLoads x
    dtlbLoadMissesP <- allocMaybe $ fmap CULong $ performanceStatisticsDtlbLoadMisses x
    dtlbStoresP <- allocMaybe $ fmap CULong $ performanceStatisticsDtlbStores x
    dtlbStoreMissesP <- allocMaybe $ fmap CULong $ performanceStatisticsDtlbStoreMisses x
    dtlbPrefetchesP <- allocMaybe $ fmap CULong $ performanceStatisticsDtlbPrefetches x
    dtlbPrefetchMissesP <- allocMaybe $ fmap CULong $ performanceStatisticsDtlbPrefetchMisses x
    itlbLoadsP <- allocMaybe $ fmap CULong $ performanceStatisticsItlbLoads x
    itlbLoadMissesP <- allocMaybe $ fmap CULong $ performanceStatisticsItlbLoadMisses x
    branchLoadsP <- allocMaybe $ fmap CULong $ performanceStatisticsBranchLoads x
    branchLoadMissesP <- allocMaybe $ fmap CULong $ performanceStatisticsBranchLoadMisses x
    nodeLoadsP <- allocMaybe $ fmap CULong $ performanceStatisticsNodeLoads x
    nodeLoadMissesP <- allocMaybe $ fmap CULong $ performanceStatisticsNodeLoadMisses x
    nodeStoresP <- allocMaybe $ fmap CULong $ performanceStatisticsNodeStores x
    nodeStoreMissesP <- allocMaybe $ fmap CULong $ performanceStatisticsNodeStoreMisses x
    nodePrefetchesP <- allocMaybe $ fmap CULong $ performanceStatisticsNodePrefetches x
    nodePrefetchMissesP <- allocMaybe $ fmap CULong $ performanceStatisticsNodePrefetchMisses x
    liftIO $ c_toPerfStatistics
      (CDouble $ performanceStatisticsTimestamp x)
      (CDouble $ performanceStatisticsDuration x)
      cyclesP
      stalledCyclesFrontendP
      stalledCyclesBackendP
      instructionsP
      cacheReferencesP
      cacheMissesP
      branchesP
      branchMissesP
      busCyclesP
      refCyclesP
      cpuClockP
      taskClockP
      pageFaultsP
      minorFaultsP
      majorFaultsP
      contextSwitchesP
      cpuMigrationsP
      alignmentFaultsP
      emulationFaultsP
      l1DcacheLoadsP
      l1DcacheLoadMissesP
      l1DcacheStoresP
      l1DcacheStoreMissesP
      l1DcachePrefetchesP
      l1DcachePrefetchMissesP
      l1IcacheLoadsP
      l1IcacheLoadMissesP
      l1IcachePrefetchesP
      l1IcachePrefetchMissesP
      llcLoadsP
      llcLoadMissesP
      llcStoresP
      llcStoreMissesP
      llcPrefetchesP
      llcPrefetchMissesP
      dtlbLoadsP
      dtlbLoadMissesP
      dtlbStoresP
      dtlbStoreMissesP
      dtlbPrefetchesP
      dtlbPrefetchMissesP
      itlbLoadsP
      itlbLoadMissesP
      branchLoadsP
      branchLoadMissesP
      nodeLoadsP
      nodeLoadMissesP
      nodeStoresP
      nodeStoreMissesP
      nodePrefetchesP
      nodePrefetchMissesP

  unmarshal p = do
    timestampP <- alloc
    durationP <- alloc
    cyclesP <- alloc
    cyclesSP <- alloc
    poke cyclesSP 0
    stalledCyclesFrontendP <- alloc
    stalledCyclesFrontendSP <- alloc
    poke stalledCyclesFrontendSP 0
    stalledCyclesBackendP <- alloc
    stalledCyclesBackendSP <- alloc
    poke stalledCyclesBackendSP 0
    instructionsP <- alloc
    instructionsSP <- alloc
    poke instructionsSP 0
    cacheReferencesP <- alloc
    cacheReferencesSP <- alloc
    poke cacheReferencesSP 0
    cacheMissesP <- alloc
    cacheMissesSP <- alloc
    poke cacheMissesSP 0
    branchesP <- alloc
    branchesSP <- alloc
    poke branchesSP 0
    branchMissesP <- alloc
    branchMissesSP <- alloc
    poke branchMissesSP 0
    busCyclesP <- alloc
    busCyclesSP <- alloc
    poke busCyclesSP 0
    refCyclesP <- alloc
    refCyclesSP <- alloc
    poke refCyclesSP 0
    cpuClockP <- alloc
    cpuClockSP <- alloc
    poke cpuClockSP 0
    taskClockP <- alloc
    taskClockSP <- alloc
    poke taskClockSP 0
    pageFaultsP <- alloc
    pageFaultsSP <- alloc
    poke pageFaultsSP 0
    minorFaultsP <- alloc
    minorFaultsSP <- alloc
    poke minorFaultsSP 0
    majorFaultsP <- alloc
    majorFaultsSP <- alloc
    poke majorFaultsSP 0
    contextSwitchesP <- alloc
    contextSwitchesSP <- alloc
    poke contextSwitchesSP 0
    cpuMigrationsP <- alloc
    cpuMigrationsSP <- alloc
    poke cpuMigrationsSP 0
    alignmentFaultsP <- alloc
    alignmentFaultsSP <- alloc
    poke alignmentFaultsSP 0
    emulationFaultsP <- alloc
    emulationFaultsSP <- alloc
    poke emulationFaultsSP 0
    l1DcacheLoadsP <- alloc
    l1DcacheLoadsSP <- alloc
    poke l1DcacheLoadsSP 0
    l1DcacheLoadMissesP <- alloc
    l1DcacheLoadMissesSP <- alloc
    poke l1DcacheLoadMissesSP 0
    l1DcacheStoresP <- alloc
    l1DcacheStoresSP <- alloc
    poke l1DcacheStoresSP 0
    l1DcacheStoreMissesP <- alloc
    l1DcacheStoreMissesSP <- alloc
    poke l1DcacheStoreMissesSP 0
    l1DcachePrefetchesP <- alloc
    l1DcachePrefetchesSP <- alloc
    poke l1DcachePrefetchesSP 0
    l1DcachePrefetchMissesP <- alloc
    l1DcachePrefetchMissesSP <- alloc
    poke l1DcachePrefetchMissesSP 0
    l1IcacheLoadsP <- alloc
    l1IcacheLoadsSP <- alloc
    poke l1IcacheLoadsSP 0
    l1IcacheLoadMissesP <- alloc
    l1IcacheLoadMissesSP <- alloc
    poke l1IcacheLoadMissesSP 0
    l1IcachePrefetchesP <- alloc
    l1IcachePrefetchesSP <- alloc
    poke l1IcachePrefetchesSP 0
    l1IcachePrefetchMissesP <- alloc
    l1IcachePrefetchMissesSP <- alloc
    poke l1IcachePrefetchMissesSP 0
    llcLoadsP <- alloc
    llcLoadsSP <- alloc
    poke llcLoadsSP 0
    llcLoadMissesP <- alloc
    llcLoadMissesSP <- alloc
    poke llcLoadMissesSP 0
    llcStoresP <- alloc
    llcStoresSP <- alloc
    poke llcStoresSP 0
    llcStoreMissesP <- alloc
    llcStoreMissesSP <- alloc
    poke llcStoreMissesSP 0
    llcPrefetchesP <- alloc
    llcPrefetchesSP <- alloc
    poke llcPrefetchesSP 0
    llcPrefetchMissesP <- alloc
    llcPrefetchMissesSP <- alloc
    poke llcPrefetchMissesSP 0
    dtlbLoadsP <- alloc
    dtlbLoadsSP <- alloc
    poke dtlbLoadsSP 0
    dtlbLoadMissesP <- alloc
    dtlbLoadMissesSP <- alloc
    poke dtlbLoadMissesSP 0
    dtlbStoresP <- alloc
    dtlbStoresSP <- alloc
    poke dtlbStoresSP 0
    dtlbStoreMissesP <- alloc
    dtlbStoreMissesSP <- alloc
    poke dtlbStoreMissesSP 0
    dtlbPrefetchesP <- alloc
    dtlbPrefetchesSP <- alloc
    poke dtlbPrefetchesSP 0
    dtlbPrefetchMissesP <- alloc
    dtlbPrefetchMissesSP <- alloc
    poke dtlbPrefetchMissesSP 0
    itlbLoadsP <- alloc
    itlbLoadsSP <- alloc
    poke itlbLoadsSP 0
    itlbLoadMissesP <- alloc
    itlbLoadMissesSP <- alloc
    poke itlbLoadMissesSP 0
    branchLoadsP <- alloc
    branchLoadsSP <- alloc
    poke branchLoadsSP 0
    branchLoadMissesP <- alloc
    branchLoadMissesSP <- alloc
    poke branchLoadMissesSP 0
    nodeLoadsP <- alloc
    nodeLoadsSP <- alloc
    poke nodeLoadsSP 0
    nodeLoadMissesP <- alloc
    nodeLoadMissesSP <- alloc
    poke nodeLoadMissesSP 0
    nodeStoresP <- alloc
    nodeStoresSP <- alloc
    poke nodeStoresSP 0
    nodeStoreMissesP <- alloc
    nodeStoreMissesSP <- alloc
    poke nodeStoreMissesSP 0
    nodePrefetchesP <- alloc
    nodePrefetchesSP <- alloc
    poke nodePrefetchesSP 0
    nodePrefetchMissesP <- alloc
    nodePrefetchMissesSP <- alloc
    poke nodePrefetchMissesSP 0
    liftIO $ c_fromPerfStatistics p
      timestampP
      durationP
      cyclesP
      cyclesSP
      stalledCyclesFrontendP
      stalledCyclesFrontendSP
      stalledCyclesBackendP
      stalledCyclesBackendSP
      instructionsP
      instructionsSP
      cacheReferencesP
      cacheReferencesSP
      cacheMissesP
      cacheMissesSP
      branchesP
      branchesSP
      branchMissesP
      branchMissesSP
      busCyclesP
      busCyclesSP
      refCyclesP
      refCyclesSP
      cpuClockP
      cpuClockSP
      taskClockP
      taskClockSP
      pageFaultsP
      pageFaultsSP
      minorFaultsP
      minorFaultsSP
      majorFaultsP
      majorFaultsSP
      contextSwitchesP
      contextSwitchesSP
      cpuMigrationsP
      cpuMigrationsSP
      alignmentFaultsP
      alignmentFaultsSP
      emulationFaultsP
      emulationFaultsSP
      l1DcacheLoadsP
      l1DcacheLoadsSP
      l1DcacheLoadMissesP
      l1DcacheLoadMissesSP
      l1DcacheStoresP
      l1DcacheStoresSP
      l1DcacheStoreMissesP
      l1DcacheStoreMissesSP
      l1DcachePrefetchesP
      l1DcachePrefetchesSP
      l1DcachePrefetchMissesP
      l1DcachePrefetchMissesSP
      l1IcacheLoadsP
      l1IcacheLoadsSP
      l1IcacheLoadMissesP
      l1IcacheLoadMissesSP
      l1IcachePrefetchesP
      l1IcachePrefetchesSP
      l1IcachePrefetchMissesP
      l1IcachePrefetchMissesSP
      llcLoadsP
      llcLoadsSP
      llcLoadMissesP
      llcLoadMissesSP
      llcStoresP
      llcStoresSP
      llcStoreMissesP
      llcStoreMissesSP
      llcPrefetchesP
      llcPrefetchesSP
      llcPrefetchMissesP
      llcPrefetchMissesSP
      dtlbLoadsP
      dtlbLoadsSP
      dtlbLoadMissesP
      dtlbLoadMissesSP
      dtlbStoresP
      dtlbStoresSP
      dtlbStoreMissesP
      dtlbStoreMissesSP
      dtlbPrefetchesP
      dtlbPrefetchesSP
      dtlbPrefetchMissesP
      dtlbPrefetchMissesSP
      itlbLoadsP
      itlbLoadsSP
      itlbLoadMissesP
      itlbLoadMissesSP
      branchLoadsP
      branchLoadsSP
      branchLoadMissesP
      branchLoadMissesSP
      nodeLoadsP
      nodeLoadsSP
      nodeLoadMissesP
      nodeLoadMissesSP
      nodeStoresP
      nodeStoresSP
      nodeStoreMissesP
      nodeStoreMissesSP
      nodePrefetchesP
      nodePrefetchesSP
      nodePrefetchMissesP
      nodePrefetchMissesSP
    (CDouble timestamp) <- peek timestampP
    (CDouble duration) <- peek durationP
    cycles <- toWord64 <$> peekMaybePrim cyclesP cyclesSP
    stalledCyclesFrontend <- toWord64 <$> peekMaybePrim stalledCyclesFrontendP stalledCyclesFrontendSP
    stalledCyclesBackend <- toWord64 <$> peekMaybePrim stalledCyclesBackendP stalledCyclesBackendSP
    instructions <- toWord64 <$> peekMaybePrim instructionsP instructionsSP
    cacheReferences <- toWord64 <$> peekMaybePrim cacheReferencesP cacheReferencesSP
    cacheMisses <- toWord64 <$> peekMaybePrim cacheMissesP cacheMissesSP
    branches <- toWord64 <$> peekMaybePrim branchesP branchesSP
    branchMisses <- toWord64 <$> peekMaybePrim branchMissesP branchMissesSP
    busCycles <- toWord64 <$> peekMaybePrim busCyclesP busCyclesSP
    refCycles <- toWord64 <$> peekMaybePrim refCyclesP refCyclesSP
    cpuClock <- toDouble <$> peekMaybePrim cpuClockP cpuClockSP
    taskClock <- toDouble <$> peekMaybePrim taskClockP taskClockSP
    pageFaults <- toWord64 <$> peekMaybePrim pageFaultsP pageFaultsSP
    minorFaults <- toWord64 <$> peekMaybePrim minorFaultsP minorFaultsSP
    majorFaults <- toWord64 <$> peekMaybePrim majorFaultsP majorFaultsSP
    contextSwitches <- toWord64 <$> peekMaybePrim contextSwitchesP contextSwitchesSP
    cpuMigrations <- toWord64 <$> peekMaybePrim cpuMigrationsP cpuMigrationsSP
    alignmentFaults <- toWord64 <$> peekMaybePrim alignmentFaultsP alignmentFaultsSP
    emulationFaults <- toWord64 <$> peekMaybePrim emulationFaultsP emulationFaultsSP
    l1DcacheLoads <- toWord64 <$> peekMaybePrim l1DcacheLoadsP l1DcacheLoadsSP
    l1DcacheLoadMisses <- toWord64 <$> peekMaybePrim l1DcacheLoadMissesP l1DcacheLoadMissesSP
    l1DcacheStores <- toWord64 <$> peekMaybePrim l1DcacheStoresP l1DcacheStoresSP
    l1DcacheStoreMisses <- toWord64 <$> peekMaybePrim l1DcacheStoreMissesP l1DcacheStoreMissesSP
    l1DcachePrefetches <- toWord64 <$> peekMaybePrim l1DcachePrefetchesP l1DcachePrefetchesSP
    l1DcachePrefetchMisses <- toWord64 <$> peekMaybePrim l1DcachePrefetchMissesP l1DcachePrefetchMissesSP
    l1IcacheLoads <- toWord64 <$> peekMaybePrim l1IcacheLoadsP l1IcacheLoadsSP
    l1IcacheLoadMisses <- toWord64 <$> peekMaybePrim l1IcacheLoadMissesP l1IcacheLoadMissesSP
    l1IcachePrefetches <- toWord64 <$> peekMaybePrim l1IcachePrefetchesP l1IcachePrefetchesSP
    l1IcachePrefetchMisses <- toWord64 <$> peekMaybePrim l1IcachePrefetchMissesP l1IcachePrefetchMissesSP
    llcLoads <- toWord64 <$> peekMaybePrim llcLoadsP llcLoadsSP
    llcLoadMisses <- toWord64 <$> peekMaybePrim llcLoadMissesP llcLoadMissesSP
    llcStores <- toWord64 <$> peekMaybePrim llcStoresP llcStoresSP
    llcStoreMisses <- toWord64 <$> peekMaybePrim llcStoreMissesP llcStoreMissesSP
    llcPrefetches <- toWord64 <$> peekMaybePrim llcPrefetchesP llcPrefetchesSP
    llcPrefetchMisses <- toWord64 <$> peekMaybePrim llcPrefetchMissesP llcPrefetchMissesSP
    dtlbLoads <- toWord64 <$> peekMaybePrim dtlbLoadsP dtlbLoadsSP
    dtlbLoadMisses <- toWord64 <$> peekMaybePrim dtlbLoadMissesP dtlbLoadMissesSP
    dtlbStores <- toWord64 <$> peekMaybePrim dtlbStoresP dtlbStoresSP
    dtlbStoreMisses <- toWord64 <$> peekMaybePrim dtlbStoreMissesP dtlbStoreMissesSP
    dtlbPrefetches <- toWord64 <$> peekMaybePrim dtlbPrefetchesP dtlbPrefetchesSP
    dtlbPrefetchMisses <- toWord64 <$> peekMaybePrim dtlbPrefetchMissesP dtlbPrefetchMissesSP
    itlbLoads <- toWord64 <$> peekMaybePrim itlbLoadsP itlbLoadsSP
    itlbLoadMisses <- toWord64 <$> peekMaybePrim itlbLoadMissesP itlbLoadMissesSP
    branchLoads <- toWord64 <$> peekMaybePrim branchLoadsP branchLoadsSP
    branchLoadMisses <- toWord64 <$> peekMaybePrim branchLoadMissesP branchLoadMissesSP
    nodeLoads <- toWord64 <$> peekMaybePrim nodeLoadsP nodeLoadsSP
    nodeLoadMisses <- toWord64 <$> peekMaybePrim nodeLoadMissesP nodeLoadMissesSP
    nodeStores <- toWord64 <$> peekMaybePrim nodeStoresP nodeStoresSP
    nodeStoreMisses <- toWord64 <$> peekMaybePrim nodeStoreMissesP nodeStoreMissesSP
    nodePrefetches <- toWord64 <$> peekMaybePrim nodePrefetchesP nodePrefetchesSP
    nodePrefetchMisses <- toWord64 <$> peekMaybePrim nodePrefetchMissesP nodePrefetchMissesSP

    return $ PerformanceStatistics
      timestamp
      duration
      cycles
      stalledCyclesFrontend
      stalledCyclesBackend
      instructions
      cacheReferences
      cacheMisses
      branches
      branchMisses
      busCycles
      refCycles
      cpuClock
      taskClock
      pageFaults
      minorFaults
      majorFaults
      contextSwitches
      cpuMigrations
      alignmentFaults
      emulationFaults
      l1DcacheLoads
      l1DcacheLoadMisses
      l1DcacheStores
      l1DcacheStoreMisses
      l1DcachePrefetches
      l1DcachePrefetchMisses
      l1IcacheLoads
      l1IcacheLoadMisses
      l1IcachePrefetches
      l1IcachePrefetchMisses
      llcLoads
      llcLoadMisses
      llcStores
      llcStoreMisses
      llcPrefetches
      llcPrefetchMisses
      dtlbLoads
      dtlbLoadMisses
      dtlbStores
      dtlbStoreMisses
      dtlbPrefetches
      dtlbPrefetchMisses
      itlbLoads
      itlbLoadMisses
      branchLoads
      branchLoadMisses
      nodeLoads
      nodeLoadMisses
      nodeStores
      nodeStoreMisses
      nodePrefetches
      nodePrefetchMisses

    where
      toDouble mx = case mx of
                      Nothing -> Nothing
                      Just (CDouble x) -> Just x
      toWord64 mx = case mx of
                      Nothing -> Nothing
                      Just (CULong x) -> Just x

  destroy = c_destroyPerfStatistics