{-# LINE 1 "libraries/base/./GHC/Event/Clock.hsc" #-}
{-# LANGUAGE Trustworthy #-}
{-# LINE 2 "libraries/base/./GHC/Event/Clock.hsc" #-}
{-# LANGUAGE NoImplicitPrelude, BangPatterns, ForeignFunctionInterface, CApiFFI #-}

module GHC.Event.Clock (getMonotonicTime, initializeTimer) where


{-# LINE 7 "libraries/base/./GHC/Event/Clock.hsc" #-}

import Foreign
import Foreign.C.Types
import GHC.Base
import GHC.Real


{-# LINE 14 "libraries/base/./GHC/Event/Clock.hsc" #-}
import Foreign.C.Error (throwErrnoIfMinus1_)
import GHC.Err
import GHC.Num

{-# LINE 18 "libraries/base/./GHC/Event/Clock.hsc" #-}

-- TODO: Implement this for Windows.

initializeTimer :: IO ()

-- | Return monotonic time in seconds, since some unspecified starting point
getMonotonicTime :: IO Double

------------------------------------------------------------------------
-- FFI binding


{-# LINE 30 "libraries/base/./GHC/Event/Clock.hsc" #-}

initializeTimer = return ()

getMonotonicTime = do
    tv <- with (CTimespec 0 0) $ \tvptr -> do
        throwErrnoIfMinus1_ "clock_gettime" (clock_gettime (1) tvptr)
{-# LINE 36 "libraries/base/./GHC/Event/Clock.hsc" #-}
        peek tvptr
    let !t = realToFrac (sec tv) + realToFrac (nsec tv) / 1000000000.0
    return t

data CTimespec = CTimespec
    { sec  :: {-# UNPACK #-} !CTime
    , nsec :: {-# UNPACK #-} !CLong
    }

instance Storable CTimespec where
    sizeOf _ = (16)
{-# LINE 47 "libraries/base/./GHC/Event/Clock.hsc" #-}
    alignment _ = alignment (undefined :: CLong)

    peek ptr = do
        sec' <- (\hsc_ptr -> peekByteOff hsc_ptr 0) ptr
{-# LINE 51 "libraries/base/./GHC/Event/Clock.hsc" #-}
        nsec' <- (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr
{-# LINE 52 "libraries/base/./GHC/Event/Clock.hsc" #-}
        return $ CTimespec sec' nsec'

    poke ptr tv = do
        (\hsc_ptr -> pokeByteOff hsc_ptr 0) ptr (sec tv)
{-# LINE 56 "libraries/base/./GHC/Event/Clock.hsc" #-}
        (\hsc_ptr -> pokeByteOff hsc_ptr 8) ptr (nsec tv)
{-# LINE 57 "libraries/base/./GHC/Event/Clock.hsc" #-}

foreign import capi unsafe "HsBase.h clock_gettime" clock_gettime
    :: Int -> Ptr CTimespec -> IO CInt


{-# LINE 109 "libraries/base/./GHC/Event/Clock.hsc" #-}