{-# 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" #-}