{-# LINE 1 "src/Data/HodaTime/Instant/Clock.hsc" #-}
{-# LANGUAGE ForeignFunctionInterface #-}
{-# LINE 2 "src/Data/HodaTime/Instant/Clock.hsc" #-}


{-# LINE 4 "src/Data/HodaTime/Instant/Clock.hsc" #-}

{-# LINE 5 "src/Data/HodaTime/Instant/Clock.hsc" #-}

{-# LINE 6 "src/Data/HodaTime/Instant/Clock.hsc" #-}

module Data.HodaTime.Instant.Clock
(
    now
)
where

import Data.HodaTime.Instant.Internal (fromUnixGetTimeOfDay, Instant)


{-# LINE 18 "src/Data/HodaTime/Instant/Clock.hsc" #-}
import Foreign.C.Error (throwErrnoIfMinus1_)
import Foreign.C.Types
import Foreign.Marshal.Alloc (allocaBytes)
import Foreign.Ptr (Ptr, nullPtr)
import Foreign.Storable

{-# LINE 24 "src/Data/HodaTime/Instant/Clock.hsc" #-}

{-# INLINE now #-}
now :: IO Instant

{-# LINE 30 "src/Data/HodaTime/Instant/Clock.hsc" #-}

-- | Create an 'Instant' from the current system time
now = allocaBytes (16) $ \ ptv -> do
{-# LINE 33 "src/Data/HodaTime/Instant/Clock.hsc" #-}
  throwErrnoIfMinus1_ "gettimeofday" $ gettimeofday ptv nullPtr
  CTime sec <- (\hsc_ptr -> peekByteOff hsc_ptr 0) ptv
{-# LINE 35 "src/Data/HodaTime/Instant/Clock.hsc" #-}
  CSUSeconds usec <- (\hsc_ptr -> peekByteOff hsc_ptr 8) ptv
{-# LINE 36 "src/Data/HodaTime/Instant/Clock.hsc" #-}
  return $ fromUnixGetTimeOfDay (fromIntegral sec) (fromIntegral usec)

foreign import ccall unsafe "time.h gettimeofday"
  gettimeofday :: Ptr () -> Ptr () -> IO CInt


{-# LINE 42 "src/Data/HodaTime/Instant/Clock.hsc" #-}