{-# LINE 1 "lib/Data/Time/Clock/Internal/CTimespec.hsc" #-}
module Data.Time.Clock.Internal.CTimespec where




{-# LINE 6 "lib/Data/Time/Clock/Internal/CTimespec.hsc" #-}

import Foreign
import Foreign.C
import System.IO.Unsafe



type ClockID = Int32
{-# LINE 14 "lib/Data/Time/Clock/Internal/CTimespec.hsc" #-}

data CTimespec = MkCTimespec CTime CLong

instance Storable CTimespec where
    sizeOf :: CTimespec -> Int
sizeOf CTimespec
_ = (Int
16)
{-# LINE 19 "lib/Data/Time/Clock/Internal/CTimespec.hsc" #-}
    alignment _ = alignment (undefined :: CLong)
    peek :: Ptr CTimespec -> IO CTimespec
peek Ptr CTimespec
p = do
        CTime
s  <- (\Ptr CTimespec
hsc_ptr -> Ptr CTimespec -> Int -> IO CTime
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr CTimespec
hsc_ptr Int
0) Ptr CTimespec
p
{-# LINE 22 "lib/Data/Time/Clock/Internal/CTimespec.hsc" #-}
        CLong
ns <- (\Ptr CTimespec
hsc_ptr -> Ptr CTimespec -> Int -> IO CLong
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr CTimespec
hsc_ptr Int
8) Ptr CTimespec
p
{-# LINE 23 "lib/Data/Time/Clock/Internal/CTimespec.hsc" #-}
        CTimespec -> IO CTimespec
forall (m :: * -> *) a. Monad m => a -> m a
return (CTime -> CLong -> CTimespec
MkCTimespec CTime
s CLong
ns)
    poke :: Ptr CTimespec -> CTimespec -> IO ()
poke Ptr CTimespec
p (MkCTimespec CTime
s CLong
ns) = do
        (\Ptr CTimespec
hsc_ptr -> Ptr CTimespec -> Int -> CTime -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CTimespec
hsc_ptr Int
0) Ptr CTimespec
p CTime
s
{-# LINE 26 "lib/Data/Time/Clock/Internal/CTimespec.hsc" #-}
        (\Ptr CTimespec
hsc_ptr -> Ptr CTimespec -> Int -> CLong -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CTimespec
hsc_ptr Int
8) Ptr CTimespec
p CLong
ns
{-# LINE 27 "lib/Data/Time/Clock/Internal/CTimespec.hsc" #-}

foreign import ccall unsafe "time.h clock_gettime"
    clock_gettime :: ClockID -> Ptr CTimespec -> IO CInt
foreign import ccall unsafe "time.h clock_getres"
    clock_getres :: ClockID -> Ptr CTimespec -> IO CInt

-- | Get the resolution of the given clock.
clockGetRes :: Int32 -> IO (Either Errno CTimespec)
{-# LINE 35 "lib/Data/Time/Clock/Internal/CTimespec.hsc" #-}
clockGetRes clockid = alloca $ \ptspec -> do
    rc <- clock_getres clockid ptspec
    case rc of
        0 -> do
            res <- peek ptspec
            return $ Right res
        _ -> do
            errno <- getErrno
            return $ Left errno

-- | Get the current time from the given clock.
clockGetTime :: ClockID -> IO CTimespec
clockGetTime :: Int32 -> IO CTimespec
clockGetTime Int32
clockid = (Ptr CTimespec -> IO CTimespec) -> IO CTimespec
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca (\Ptr CTimespec
ptspec -> do
    String -> IO CInt -> IO ()
forall a. (Eq a, Num a) => String -> IO a -> IO ()
throwErrnoIfMinus1_ String
"clock_gettime" (IO CInt -> IO ()) -> IO CInt -> IO ()
forall a b. (a -> b) -> a -> b
$ Int32 -> Ptr CTimespec -> IO CInt
clock_gettime Int32
clockid Ptr CTimespec
ptspec
    Ptr CTimespec -> IO CTimespec
forall a. Storable a => Ptr a -> IO a
peek Ptr CTimespec
ptspec
    )

clock_REALTIME :: ClockID
clock_REALTIME :: Int32
clock_REALTIME = Int32
0
{-# LINE 54 "lib/Data/Time/Clock/Internal/CTimespec.hsc" #-}

clock_TAI :: ClockID
clock_TAI :: Int32
clock_TAI = Int32
11
{-# LINE 57 "lib/Data/Time/Clock/Internal/CTimespec.hsc" #-}

realtimeRes :: CTimespec
realtimeRes :: CTimespec
realtimeRes = IO CTimespec -> CTimespec
forall a. IO a -> a
unsafePerformIO (IO CTimespec -> CTimespec) -> IO CTimespec -> CTimespec
forall a b. (a -> b) -> a -> b
$ do
    Either Errno CTimespec
mres <- Int32 -> IO (Either Errno CTimespec)
clockGetRes Int32
clock_REALTIME
    case Either Errno CTimespec
mres of
        Left Errno
errno -> IOError -> IO CTimespec
forall a. IOError -> IO a
ioError (String -> Errno -> Maybe Handle -> Maybe String -> IOError
errnoToIOError String
"clock_getres" Errno
errno Maybe Handle
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing)
        Right CTimespec
res -> CTimespec -> IO CTimespec
forall (m :: * -> *) a. Monad m => a -> m a
return CTimespec
res

clockResolution :: ClockID -> Maybe CTimespec
clockResolution :: Int32 -> Maybe CTimespec
clockResolution Int32
clockid = IO (Maybe CTimespec) -> Maybe CTimespec
forall a. IO a -> a
unsafePerformIO (IO (Maybe CTimespec) -> Maybe CTimespec)
-> IO (Maybe CTimespec) -> Maybe CTimespec
forall a b. (a -> b) -> a -> b
$ do
    Either Errno CTimespec
mres <- Int32 -> IO (Either Errno CTimespec)
clockGetRes Int32
clockid
    case Either Errno CTimespec
mres of
        Left Errno
_ -> Maybe CTimespec -> IO (Maybe CTimespec)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe CTimespec
forall a. Maybe a
Nothing
        Right CTimespec
res -> Maybe CTimespec -> IO (Maybe CTimespec)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe CTimespec -> IO (Maybe CTimespec))
-> Maybe CTimespec -> IO (Maybe CTimespec)
forall a b. (a -> b) -> a -> b
$ CTimespec -> Maybe CTimespec
forall a. a -> Maybe a
Just CTimespec
res


{-# LINE 73 "lib/Data/Time/Clock/Internal/CTimespec.hsc" #-}