{-# LINE 1 "src/System/Posix/Clock.hsc" #-}
{-# LANGUAGE UnicodeSyntax #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE ForeignFunctionInterface #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE FlexibleContexts #-}
module System.Posix.Clock (
TimeSpec,
timeSpecSeconds,
timeSpecNanos,
mkTimeSpec,
timeSpecV,
timeSpecToInt64,
Clock(..),
monotonicClock,
realtimeClock,
processTimeClock,
threadTimeClock,
getProcessClock,
getClockResolution,
getClockTime,
setClockTime,
clockSleep,
clockSleepAbs,
) where
import Data.Int
import Data.Word
import Data.Ratio (numerator)
import Data.List (unfoldr)
import Control.Applicative ((<$>), (<*>))
import Control.Monad.Base
import Foreign.Ptr (Ptr, nullPtr)
import Foreign.Storable (Storable(..))
import Foreign.Marshal.Alloc (alloca)
import Foreign.Marshal.Utils (with)
import Foreign.C.Types (CULong)
{-# LINE 42 "src/System/Posix/Clock.hsc" #-}
import Foreign.C.Types (CInt(..), CTime(..))
{-# LINE 46 "src/System/Posix/Clock.hsc" #-}
import Foreign.C.Error (getErrno, eINTR, throwErrno, throwErrnoIfMinus1_)
{-# LINE 48 "src/System/Posix/Clock.hsc" #-}
import System.Posix.Types (CPid(..))
{-# LINE 50 "src/System/Posix/Clock.hsc" #-}
import System.Posix.Types (ProcessID)
{-# LINE 54 "src/System/Posix/Clock.hsc" #-}
nsPerSecond ∷ Num α ⇒ α
nsPerSecond :: forall α. Num α => α
nsPerSecond = α
1000000000
{-# INLINE nsPerSecond #-}
minSecsInInt, minNsInInt ∷ Int
(Int
minSecsInInt, Int
minNsInInt) = (Int
forall a. Bounded a => a
minBound ∷ Int) Int -> Int -> (Int, Int)
forall a. Integral a => a -> a -> (a, a)
`divMod` Int
forall α. Num α => α
nsPerSecond
maxSecsInInt, maxNsInInt ∷ Int
(Int
maxSecsInInt, Int
maxNsInInt) = (Int
forall a. Bounded a => a
maxBound ∷ Int) Int -> Int -> (Int, Int)
forall a. Integral a => a -> a -> (a, a)
`divMod` Int
forall α. Num α => α
nsPerSecond
data TimeSpec = TimeSpec { TimeSpec -> CTime
timeSpecSeconds ∷ CTime
, TimeSpec -> CULong
timeSpecNanos ∷ CULong
} deriving (TimeSpec -> TimeSpec -> Bool
(TimeSpec -> TimeSpec -> Bool)
-> (TimeSpec -> TimeSpec -> Bool) -> Eq TimeSpec
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: TimeSpec -> TimeSpec -> Bool
== :: TimeSpec -> TimeSpec -> Bool
$c/= :: TimeSpec -> TimeSpec -> Bool
/= :: TimeSpec -> TimeSpec -> Bool
Eq, Int -> TimeSpec -> ShowS
[TimeSpec] -> ShowS
TimeSpec -> String
(Int -> TimeSpec -> ShowS)
-> (TimeSpec -> String) -> ([TimeSpec] -> ShowS) -> Show TimeSpec
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TimeSpec -> ShowS
showsPrec :: Int -> TimeSpec -> ShowS
$cshow :: TimeSpec -> String
show :: TimeSpec -> String
$cshowList :: [TimeSpec] -> ShowS
showList :: [TimeSpec] -> ShowS
Show)
mkTimeSpec ∷ CTime → CULong → TimeSpec
mkTimeSpec :: CTime -> CULong -> TimeSpec
mkTimeSpec CTime
s CULong
ns | CULong
ns CULong -> CULong -> Bool
forall a. Ord a => a -> a -> Bool
< CULong
forall α. Num α => α
nsPerSecond = CTime -> CULong -> TimeSpec
TimeSpec CTime
s CULong
ns
| Bool
otherwise = CTime -> CULong -> TimeSpec
TimeSpec (CTime
s CTime -> CTime -> CTime
forall a. Num a => a -> a -> a
+ CULong -> CTime
forall a b. (Integral a, Num b) => a -> b
fromIntegral CULong
q) CULong
r
where (CULong
q, CULong
r) = CULong
ns CULong -> CULong -> (CULong, CULong)
forall a. Integral a => a -> a -> (a, a)
`quotRem` CULong
forall α. Num α => α
nsPerSecond
timeSpecV ∷ TimeSpec → (CTime, CULong)
timeSpecV :: TimeSpec -> (CTime, CULong)
timeSpecV (TimeSpec CTime
s CULong
ns) = (CTime
s, CULong
ns)
{-# INLINE timeSpecV #-}
instance Ord TimeSpec where
(TimeSpec CTime
s1 CULong
ns1) compare :: TimeSpec -> TimeSpec -> Ordering
`compare` (TimeSpec CTime
s2 CULong
ns2) =
case CTime
s1 CTime -> CTime -> Ordering
forall a. Ord a => a -> a -> Ordering
`compare` CTime
s2 of
Ordering
EQ → CULong
ns1 CULong -> CULong -> Ordering
forall a. Ord a => a -> a -> Ordering
`compare` CULong
ns2
Ordering
x → Ordering
x
instance Bounded TimeSpec where
minBound :: TimeSpec
minBound = CTime -> CULong -> TimeSpec
TimeSpec (Int64 -> CTime
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int64
forall a. Bounded a => a
minBound ∷ Int64)) CULong
0
{-# LINE 97 "src/System/Posix/Clock.hsc" #-}
maxBound = TimeSpec (fromIntegral (maxBound ∷ Int64))
{-# LINE 98 "src/System/Posix/Clock.hsc" #-}
(nsPerSecond - 1)
instance Num TimeSpec where
(TimeSpec CTime
s1 CULong
ns1) * :: TimeSpec -> TimeSpec -> TimeSpec
* (TimeSpec CTime
s2 CULong
ns2) =
CTime -> CULong -> TimeSpec
mkTimeSpec (CTime
s1 CTime -> CTime -> CTime
forall a. Num a => a -> a -> a
* CTime
s2 CTime -> CTime -> CTime
forall a. Num a => a -> a -> a
* CTime
forall α. Num α => α
nsPerSecond CTime -> CTime -> CTime
forall a. Num a => a -> a -> a
+
CTime
s1 CTime -> CTime -> CTime
forall a. Num a => a -> a -> a
* (CULong -> CTime
forall a b. (Integral a, Num b) => a -> b
fromIntegral CULong
ns2) CTime -> CTime -> CTime
forall a. Num a => a -> a -> a
+ CTime
s2 CTime -> CTime -> CTime
forall a. Num a => a -> a -> a
* (CULong -> CTime
forall a b. (Integral a, Num b) => a -> b
fromIntegral CULong
ns1) CTime -> CTime -> CTime
forall a. Num a => a -> a -> a
+
(Word64 -> CTime
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
q)) (CULong -> TimeSpec) -> CULong -> TimeSpec
forall a b. (a -> b) -> a -> b
$ Word64 -> CULong
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
r
where (Word64
q, Word64
r) = ((CULong -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral CULong
ns1 ∷ Word64) Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
*
(CULong -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral CULong
ns2 ∷ Word64)) Word64 -> Word64 -> (Word64, Word64)
forall a. Integral a => a -> a -> (a, a)
`quotRem` Word64
forall α. Num α => α
nsPerSecond
(TimeSpec CTime
s1 CULong
ns1) + :: TimeSpec -> TimeSpec -> TimeSpec
+ (TimeSpec CTime
s2 CULong
ns2) = CTime -> CULong -> TimeSpec
mkTimeSpec (CTime
s1 CTime -> CTime -> CTime
forall a. Num a => a -> a -> a
+ CTime
s2) (CULong
ns1 CULong -> CULong -> CULong
forall a. Num a => a -> a -> a
+ CULong
ns2)
(TimeSpec CTime
s1 CULong
ns1) - :: TimeSpec -> TimeSpec -> TimeSpec
- (TimeSpec CTime
s2 CULong
ns2) =
if CULong
ns1 CULong -> CULong -> Bool
forall a. Ord a => a -> a -> Bool
< CULong
ns2 then CTime -> CULong -> TimeSpec
TimeSpec (CTime
s1 CTime -> CTime -> CTime
forall a. Num a => a -> a -> a
- CTime
s2 CTime -> CTime -> CTime
forall a. Num a => a -> a -> a
- CTime
1) (CULong
forall α. Num α => α
nsPerSecond CULong -> CULong -> CULong
forall a. Num a => a -> a -> a
- CULong
ns2 CULong -> CULong -> CULong
forall a. Num a => a -> a -> a
+ CULong
ns1)
else CTime -> CULong -> TimeSpec
TimeSpec (CTime
s1 CTime -> CTime -> CTime
forall a. Num a => a -> a -> a
- CTime
s2) (CULong
ns1 CULong -> CULong -> CULong
forall a. Num a => a -> a -> a
- CULong
ns2)
negate :: TimeSpec -> TimeSpec
negate (TimeSpec CTime
s CULong
ns) = CTime -> CULong -> TimeSpec
mkTimeSpec ((-CTime
s) CTime -> CTime -> CTime
forall a. Num a => a -> a -> a
- CTime
1) (CULong
forall α. Num α => α
nsPerSecond CULong -> CULong -> CULong
forall a. Num a => a -> a -> a
- CULong
ns)
abs :: TimeSpec -> TimeSpec
abs ts :: TimeSpec
ts@(TimeSpec CTime
s CULong
_) = if CTime
s CTime -> CTime -> Bool
forall a. Ord a => a -> a -> Bool
>= CTime
0 then TimeSpec
ts else TimeSpec -> TimeSpec
forall a. Num a => a -> a
negate TimeSpec
ts
signum :: TimeSpec -> TimeSpec
signum (TimeSpec CTime
s CULong
ns) | CTime
s CTime -> CTime -> Bool
forall a. Ord a => a -> a -> Bool
< CTime
0 = CTime -> CULong -> TimeSpec
TimeSpec (-CTime
1) (CULong
forall α. Num α => α
nsPerSecond CULong -> CULong -> CULong
forall a. Num a => a -> a -> a
- CULong
1)
| Bool
otherwise = CTime -> CULong -> TimeSpec
TimeSpec CTime
0 (CULong -> TimeSpec) -> CULong -> TimeSpec
forall a b. (a -> b) -> a -> b
$ CULong -> CULong
forall a. Num a => a -> a
signum CULong
ns
fromInteger :: Integer -> TimeSpec
fromInteger Integer
i = CTime -> CULong -> TimeSpec
TimeSpec (Integer -> CTime
forall a. Num a => Integer -> a
fromInteger Integer
s) (Integer -> CULong
forall a. Num a => Integer -> a
fromInteger Integer
ns)
where (Integer
s, Integer
ns) = Integer
i Integer -> Integer -> (Integer, Integer)
forall a. Integral a => a -> a -> (a, a)
`divMod` Integer
forall α. Num α => α
nsPerSecond
instance Real TimeSpec where
toRational :: TimeSpec -> Rational
toRational (TimeSpec CTime
s CULong
ns) = CTime -> Rational
forall a. Real a => a -> Rational
toRational CTime
s Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
* Rational
forall α. Num α => α
nsPerSecond Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
+ CULong -> Rational
forall a. Real a => a -> Rational
toRational CULong
ns
instance Enum TimeSpec where
succ :: TimeSpec -> TimeSpec
succ (TimeSpec CTime
s CULong
ns) | CULong
ns CULong -> CULong -> Bool
forall a. Eq a => a -> a -> Bool
== CULong
forall α. Num α => α
nsPerSecond CULong -> CULong -> CULong
forall a. Num a => a -> a -> a
- CULong
1 = CTime -> CULong -> TimeSpec
TimeSpec (CTime -> CTime
forall a. Enum a => a -> a
succ CTime
s) CULong
0
| Bool
otherwise = CTime -> CULong -> TimeSpec
TimeSpec CTime
s (CULong -> CULong
forall a. Enum a => a -> a
succ CULong
ns)
pred :: TimeSpec -> TimeSpec
pred (TimeSpec CTime
s CULong
ns) | CULong
ns CULong -> CULong -> Bool
forall a. Eq a => a -> a -> Bool
== CULong
0 = CTime -> CULong -> TimeSpec
TimeSpec (CTime -> CTime
forall a. Enum a => a -> a
pred CTime
s) (CULong
forall α. Num α => α
nsPerSecond CULong -> CULong -> CULong
forall a. Num a => a -> a -> a
- CULong
1)
| Bool
otherwise = CTime -> CULong -> TimeSpec
TimeSpec CTime
s (CULong
ns CULong -> CULong -> CULong
forall a. Num a => a -> a -> a
- CULong
1)
toEnum :: Int -> TimeSpec
toEnum Int
i = CTime -> CULong -> TimeSpec
TimeSpec (Int -> CTime
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
s) (Int -> CULong
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
ns)
where (Int
s, Int
ns) = Int
i Int -> Int -> (Int, Int)
forall a. Integral a => a -> a -> (a, a)
`divMod` Int
forall α. Num α => α
nsPerSecond
fromEnum :: TimeSpec -> Int
fromEnum (TimeSpec CTime
s CULong
ns) =
if Int64
s' Int64 -> Int64 -> Bool
forall a. Ord a => a -> a -> Bool
< Int64
minSecs Bool -> Bool -> Bool
|| (Int64
s' Int64 -> Int64 -> Bool
forall a. Eq a => a -> a -> Bool
== Int64
minSecs Bool -> Bool -> Bool
&& CULong
ns CULong -> CULong -> Bool
forall a. Ord a => a -> a -> Bool
< CULong
minNs) Bool -> Bool -> Bool
||
Int64
s' Int64 -> Int64 -> Bool
forall a. Ord a => a -> a -> Bool
> Int64
maxSecs Bool -> Bool -> Bool
|| (Int64
s' Int64 -> Int64 -> Bool
forall a. Eq a => a -> a -> Bool
== Int64
maxSecs Bool -> Bool -> Bool
&& CULong
ns CULong -> CULong -> Bool
forall a. Ord a => a -> a -> Bool
> CULong
maxNs)
then String -> Int
forall a. HasCallStack => String -> a
error String
"TimeSpec.fromEnum"
else Int64 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int64
s' Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
forall α. Num α => α
nsPerSecond Int -> Int -> Int
forall a. Num a => a -> a -> a
+ CULong -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral CULong
ns
where s', minSecs, maxSecs ∷ Int64
{-# LINE 134 "src/System/Posix/Clock.hsc" #-}
{-# LINE 135 "src/System/Posix/Clock.hsc" #-}
CTime Int64
s' = CTime
s
{-# LINE 139 "src/System/Posix/Clock.hsc" #-}
minSecs :: Int64
minSecs = Int -> Int64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
minSecsInInt
maxSecs :: Int64
maxSecs = Int -> Int64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
maxSecsInInt
minNs, maxNs ∷ CULong
minNs :: CULong
minNs = Int -> CULong
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
minNsInInt
maxNs :: CULong
maxNs = Int -> CULong
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
maxNsInInt
enumFrom :: TimeSpec -> [TimeSpec]
enumFrom TimeSpec
x = TimeSpec -> TimeSpec -> [TimeSpec]
forall a. Enum a => a -> a -> [a]
enumFromTo TimeSpec
x TimeSpec
forall a. Bounded a => a
maxBound
enumFromThen :: TimeSpec -> TimeSpec -> [TimeSpec]
enumFromThen TimeSpec
x TimeSpec
y = TimeSpec -> TimeSpec -> TimeSpec -> [TimeSpec]
forall a. Enum a => a -> a -> a -> [a]
enumFromThenTo TimeSpec
x TimeSpec
y TimeSpec
bound
where bound :: TimeSpec
bound | TimeSpec
y TimeSpec -> TimeSpec -> Bool
forall a. Ord a => a -> a -> Bool
>= TimeSpec
x = TimeSpec
forall a. Bounded a => a
maxBound
| Bool
otherwise = TimeSpec
forall a. Bounded a => a
minBound
enumFromTo :: TimeSpec -> TimeSpec -> [TimeSpec]
enumFromTo TimeSpec
x TimeSpec
y
| TimeSpec
y TimeSpec -> TimeSpec -> Bool
forall a. Ord a => a -> a -> Bool
>= TimeSpec
x = (TimeSpec -> Maybe (TimeSpec, TimeSpec)) -> TimeSpec -> [TimeSpec]
forall b a. (b -> Maybe (a, b)) -> b -> [a]
unfoldr (\TimeSpec
z → if TimeSpec
z TimeSpec -> TimeSpec -> Bool
forall a. Eq a => a -> a -> Bool
== TimeSpec
y then Maybe (TimeSpec, TimeSpec)
forall a. Maybe a
Nothing else (TimeSpec, TimeSpec) -> Maybe (TimeSpec, TimeSpec)
forall a. a -> Maybe a
Just (TimeSpec
z, TimeSpec
z TimeSpec -> TimeSpec -> TimeSpec
forall a. Num a => a -> a -> a
+ TimeSpec
1)) TimeSpec
x
| Bool
otherwise = (TimeSpec -> Maybe (TimeSpec, TimeSpec)) -> TimeSpec -> [TimeSpec]
forall b a. (b -> Maybe (a, b)) -> b -> [a]
unfoldr (\TimeSpec
z → if TimeSpec
z TimeSpec -> TimeSpec -> Bool
forall a. Eq a => a -> a -> Bool
== TimeSpec
y then Maybe (TimeSpec, TimeSpec)
forall a. Maybe a
Nothing else (TimeSpec, TimeSpec) -> Maybe (TimeSpec, TimeSpec)
forall a. a -> Maybe a
Just (TimeSpec
z, TimeSpec
z TimeSpec -> TimeSpec -> TimeSpec
forall a. Num a => a -> a -> a
- TimeSpec
1)) TimeSpec
x
enumFromThenTo :: TimeSpec -> TimeSpec -> TimeSpec -> [TimeSpec]
enumFromThenTo TimeSpec
x TimeSpec
n TimeSpec
y
| TimeSpec
d TimeSpec -> TimeSpec -> Bool
forall a. Ord a => a -> a -> Bool
>= TimeSpec
0 =
if TimeSpec
y TimeSpec -> TimeSpec -> Bool
forall a. Ord a => a -> a -> Bool
< TimeSpec
x
then []
else (TimeSpec -> Maybe (TimeSpec, TimeSpec)) -> TimeSpec -> [TimeSpec]
forall b a. (b -> Maybe (a, b)) -> b -> [a]
unfoldr (\TimeSpec
z → if TimeSpec
z TimeSpec -> TimeSpec -> Bool
forall a. Ord a => a -> a -> Bool
> TimeSpec
y then Maybe (TimeSpec, TimeSpec)
forall a. Maybe a
Nothing else (TimeSpec, TimeSpec) -> Maybe (TimeSpec, TimeSpec)
forall a. a -> Maybe a
Just (TimeSpec
z, TimeSpec
z TimeSpec -> TimeSpec -> TimeSpec
forall a. Num a => a -> a -> a
+ TimeSpec
d)) TimeSpec
x
| Bool
otherwise =
if TimeSpec
y TimeSpec -> TimeSpec -> Bool
forall a. Ord a => a -> a -> Bool
> TimeSpec
x
then []
else (TimeSpec -> Maybe (TimeSpec, TimeSpec)) -> TimeSpec -> [TimeSpec]
forall b a. (b -> Maybe (a, b)) -> b -> [a]
unfoldr (\TimeSpec
z → if TimeSpec
z TimeSpec -> TimeSpec -> Bool
forall a. Ord a => a -> a -> Bool
< TimeSpec
y then Maybe (TimeSpec, TimeSpec)
forall a. Maybe a
Nothing else (TimeSpec, TimeSpec) -> Maybe (TimeSpec, TimeSpec)
forall a. a -> Maybe a
Just (TimeSpec
z, TimeSpec
z TimeSpec -> TimeSpec -> TimeSpec
forall a. Num a => a -> a -> a
- TimeSpec
d)) TimeSpec
x
where d :: TimeSpec
d = TimeSpec
n TimeSpec -> TimeSpec -> TimeSpec
forall a. Num a => a -> a -> a
- TimeSpec
x
instance Integral TimeSpec where
toInteger :: TimeSpec -> Integer
toInteger (TimeSpec CTime
s CULong
ns) = (Rational -> Integer
forall a. Ratio a -> a
numerator (Rational -> Integer) -> Rational -> Integer
forall a b. (a -> b) -> a -> b
$ CTime -> Rational
forall a. Real a => a -> Rational
toRational CTime
s) Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
forall α. Num α => α
nsPerSecond Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+
CULong -> Integer
forall a. Integral a => a -> Integer
toInteger CULong
ns
quotRem :: TimeSpec -> TimeSpec -> (TimeSpec, TimeSpec)
quotRem TimeSpec
tsN TimeSpec
tsD = (Integer -> TimeSpec
forall a. Num a => Integer -> a
fromInteger Integer
q, Integer -> TimeSpec
forall a. Num a => Integer -> a
fromInteger Integer
r)
where (Integer
q, Integer
r) = Integer -> Integer -> (Integer, Integer)
forall a. Integral a => a -> a -> (a, a)
quotRem (TimeSpec -> Integer
forall a. Integral a => a -> Integer
toInteger TimeSpec
tsN) (TimeSpec -> Integer
forall a. Integral a => a -> Integer
toInteger TimeSpec
tsD)
timeSpecToInt64 ∷ TimeSpec → Int64
timeSpecToInt64 :: TimeSpec -> Int64
timeSpecToInt64 (TimeSpec CTime
s CULong
ns) =
{-# LINE 172 "src/System/Posix/Clock.hsc" #-}
let CTime s' = s in
fromIntegral s' * nsPerSecond +
{-# LINE 183 "src/System/Posix/Clock.hsc" #-}
fromIntegral ns
{-# INLINE timeSpecToInt64 #-}
{-# RULES
"fromIntegral/TimeSpec->Int64" fromIntegral = timeSpecToInt64
"fromIntegral/TimeSpec->Word64" fromIntegral = fromIntegral . timeSpecToInt64
#-}
instance Storable TimeSpec where
alignment :: TimeSpec -> Int
alignment TimeSpec
_ = Int
8
{-# LINE 193 "src/System/Posix/Clock.hsc" #-}
sizeOf _ = (16)
{-# LINE 194 "src/System/Posix/Clock.hsc" #-}
peek p = TimeSpec <$> (\hsc_ptr -> peekByteOff hsc_ptr 0) p
{-# LINE 195 "src/System/Posix/Clock.hsc" #-}
<*> (\hsc_ptr -> peekByteOff hsc_ptr 8) p
{-# LINE 196 "src/System/Posix/Clock.hsc" #-}
poke p (TimeSpec seconds nanoseconds) = do
(\hsc_ptr -> pokeByteOff hsc_ptr 0) p seconds
{-# LINE 198 "src/System/Posix/Clock.hsc" #-}
(\hsc_ptr -> pokeByteOff hsc_ptr 8) p nanoseconds
{-# LINE 199 "src/System/Posix/Clock.hsc" #-}
newtype Clock = Clock Int32 deriving (Clock -> Clock -> Bool
(Clock -> Clock -> Bool) -> (Clock -> Clock -> Bool) -> Eq Clock
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Clock -> Clock -> Bool
== :: Clock -> Clock -> Bool
$c/= :: Clock -> Clock -> Bool
/= :: Clock -> Clock -> Bool
Eq, Eq Clock
Eq Clock =>
(Clock -> Clock -> Ordering)
-> (Clock -> Clock -> Bool)
-> (Clock -> Clock -> Bool)
-> (Clock -> Clock -> Bool)
-> (Clock -> Clock -> Bool)
-> (Clock -> Clock -> Clock)
-> (Clock -> Clock -> Clock)
-> Ord Clock
Clock -> Clock -> Bool
Clock -> Clock -> Ordering
Clock -> Clock -> Clock
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Clock -> Clock -> Ordering
compare :: Clock -> Clock -> Ordering
$c< :: Clock -> Clock -> Bool
< :: Clock -> Clock -> Bool
$c<= :: Clock -> Clock -> Bool
<= :: Clock -> Clock -> Bool
$c> :: Clock -> Clock -> Bool
> :: Clock -> Clock -> Bool
$c>= :: Clock -> Clock -> Bool
>= :: Clock -> Clock -> Bool
$cmax :: Clock -> Clock -> Clock
max :: Clock -> Clock -> Clock
$cmin :: Clock -> Clock -> Clock
min :: Clock -> Clock -> Clock
Ord, Int -> Clock -> ShowS
[Clock] -> ShowS
Clock -> String
(Int -> Clock -> ShowS)
-> (Clock -> String) -> ([Clock] -> ShowS) -> Show Clock
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Clock -> ShowS
showsPrec :: Int -> Clock -> ShowS
$cshow :: Clock -> String
show :: Clock -> String
$cshowList :: [Clock] -> ShowS
showList :: [Clock] -> ShowS
Show, Ptr Clock -> IO Clock
Ptr Clock -> Int -> IO Clock
Ptr Clock -> Int -> Clock -> IO ()
Ptr Clock -> Clock -> IO ()
Clock -> Int
(Clock -> Int)
-> (Clock -> Int)
-> (Ptr Clock -> Int -> IO Clock)
-> (Ptr Clock -> Int -> Clock -> IO ())
-> (forall b. Ptr b -> Int -> IO Clock)
-> (forall b. Ptr b -> Int -> Clock -> IO ())
-> (Ptr Clock -> IO Clock)
-> (Ptr Clock -> Clock -> IO ())
-> Storable Clock
forall b. Ptr b -> Int -> IO Clock
forall b. Ptr b -> Int -> Clock -> IO ()
forall a.
(a -> Int)
-> (a -> Int)
-> (Ptr a -> Int -> IO a)
-> (Ptr a -> Int -> a -> IO ())
-> (forall b. Ptr b -> Int -> IO a)
-> (forall b. Ptr b -> Int -> a -> IO ())
-> (Ptr a -> IO a)
-> (Ptr a -> a -> IO ())
-> Storable a
$csizeOf :: Clock -> Int
sizeOf :: Clock -> Int
$calignment :: Clock -> Int
alignment :: Clock -> Int
$cpeekElemOff :: Ptr Clock -> Int -> IO Clock
peekElemOff :: Ptr Clock -> Int -> IO Clock
$cpokeElemOff :: Ptr Clock -> Int -> Clock -> IO ()
pokeElemOff :: Ptr Clock -> Int -> Clock -> IO ()
$cpeekByteOff :: forall b. Ptr b -> Int -> IO Clock
peekByteOff :: forall b. Ptr b -> Int -> IO Clock
$cpokeByteOff :: forall b. Ptr b -> Int -> Clock -> IO ()
pokeByteOff :: forall b. Ptr b -> Int -> Clock -> IO ()
$cpeek :: Ptr Clock -> IO Clock
peek :: Ptr Clock -> IO Clock
$cpoke :: Ptr Clock -> Clock -> IO ()
poke :: Ptr Clock -> Clock -> IO ()
Storable)
{-# LINE 202 "src/System/Posix/Clock.hsc" #-}
monotonicClock :: Clock
monotonicClock :: Clock
monotonicClock = Int32 -> Clock
Clock Int32
1
realtimeClock :: Clock
realtimeClock :: Clock
realtimeClock = Int32 -> Clock
Clock Int32
0
processTimeClock :: Clock
processTimeClock :: Clock
processTimeClock = Int32 -> Clock
Clock Int32
2
threadTimeClock :: Clock
threadTimeClock :: Clock
threadTimeClock = Int32 -> Clock
Clock Int32
3
{-# LINE 209 "src/System/Posix/Clock.hsc" #-}
getProcessClock ∷ MonadBase IO μ ⇒ ProcessID → μ Clock
getProcessClock :: forall (μ :: * -> *). MonadBase IO μ => ProcessID -> μ Clock
getProcessClock ProcessID
pid =
IO Clock -> μ Clock
forall α. IO α -> μ α
forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α
liftBase (IO Clock -> μ Clock) -> IO Clock -> μ Clock
forall a b. (a -> b) -> a -> b
$ (Ptr Clock -> IO Clock) -> IO Clock
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr Clock -> IO Clock) -> IO Clock)
-> (Ptr Clock -> IO Clock) -> IO Clock
forall a b. (a -> b) -> a -> b
$ \Ptr Clock
p → do
String -> IO CInt -> IO ()
forall a. (Eq a, Num a) => String -> IO a -> IO ()
throwErrnoIfMinus1_ String
"getProcClock" (IO CInt -> IO ()) -> IO CInt -> IO ()
forall a b. (a -> b) -> a -> b
$ ProcessID -> Ptr Clock -> IO CInt
c_clock_getcpuclockid ProcessID
pid Ptr Clock
p
Ptr Clock -> IO Clock
forall a. Storable a => Ptr a -> IO a
peek Ptr Clock
p
getClockResolution ∷ MonadBase IO μ ⇒ Clock → μ TimeSpec
getClockResolution :: forall (μ :: * -> *). MonadBase IO μ => Clock -> μ TimeSpec
getClockResolution Clock
clock =
IO TimeSpec -> μ TimeSpec
forall α. IO α -> μ α
forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α
liftBase (IO TimeSpec -> μ TimeSpec) -> IO TimeSpec -> μ TimeSpec
forall a b. (a -> b) -> a -> b
$ (Ptr TimeSpec -> IO TimeSpec) -> IO TimeSpec
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr TimeSpec -> IO TimeSpec) -> IO TimeSpec)
-> (Ptr TimeSpec -> IO TimeSpec) -> IO TimeSpec
forall a b. (a -> b) -> a -> b
$ \Ptr TimeSpec
p → do
String -> IO CInt -> IO ()
forall a. (Eq a, Num a) => String -> IO a -> IO ()
throwErrnoIfMinus1_ String
"getClockResolution" (IO CInt -> IO ()) -> IO CInt -> IO ()
forall a b. (a -> b) -> a -> b
$ Clock -> Ptr TimeSpec -> IO CInt
c_clock_getres Clock
clock Ptr TimeSpec
p
Ptr TimeSpec -> IO TimeSpec
forall a. Storable a => Ptr a -> IO a
peek Ptr TimeSpec
p
getClockTime ∷ MonadBase IO μ ⇒ Clock → μ TimeSpec
getClockTime :: forall (μ :: * -> *). MonadBase IO μ => Clock -> μ TimeSpec
getClockTime Clock
clock =
IO TimeSpec -> μ TimeSpec
forall α. IO α -> μ α
forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α
liftBase (IO TimeSpec -> μ TimeSpec) -> IO TimeSpec -> μ TimeSpec
forall a b. (a -> b) -> a -> b
$ (Ptr TimeSpec -> IO TimeSpec) -> IO TimeSpec
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr TimeSpec -> IO TimeSpec) -> IO TimeSpec)
-> (Ptr TimeSpec -> IO TimeSpec) -> IO TimeSpec
forall a b. (a -> b) -> a -> b
$ \Ptr TimeSpec
p → do
String -> IO CInt -> IO ()
forall a. (Eq a, Num a) => String -> IO a -> IO ()
throwErrnoIfMinus1_ String
"getClockTime" (IO CInt -> IO ()) -> IO CInt -> IO ()
forall a b. (a -> b) -> a -> b
$ Clock -> Ptr TimeSpec -> IO CInt
c_clock_gettime Clock
clock Ptr TimeSpec
p
Ptr TimeSpec -> IO TimeSpec
forall a. Storable a => Ptr a -> IO a
peek Ptr TimeSpec
p
setClockTime ∷ MonadBase IO μ ⇒ Clock → TimeSpec → μ ()
setClockTime :: forall (μ :: * -> *). MonadBase IO μ => Clock -> TimeSpec -> μ ()
setClockTime Clock
clock TimeSpec
ts =
IO () -> μ ()
forall α. IO α -> μ α
forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α
liftBase (IO () -> μ ()) -> IO () -> μ ()
forall a b. (a -> b) -> a -> b
$ TimeSpec -> (Ptr TimeSpec -> IO ()) -> IO ()
forall a b. Storable a => a -> (Ptr a -> IO b) -> IO b
with TimeSpec
ts ((Ptr TimeSpec -> IO ()) -> IO ())
-> (Ptr TimeSpec -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$
String -> IO CInt -> IO ()
forall a. (Eq a, Num a) => String -> IO a -> IO ()
throwErrnoIfMinus1_ String
"setClockTime" (IO CInt -> IO ())
-> (Ptr TimeSpec -> IO CInt) -> Ptr TimeSpec -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Clock -> Ptr TimeSpec -> IO CInt
c_clock_settime Clock
clock
clockSleep ∷ MonadBase IO μ ⇒ Clock → TimeSpec → μ TimeSpec
clockSleep :: forall (μ :: * -> *).
MonadBase IO μ =>
Clock -> TimeSpec -> μ TimeSpec
clockSleep Clock
clock TimeSpec
ts =
IO TimeSpec -> μ TimeSpec
forall α. IO α -> μ α
forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α
liftBase (IO TimeSpec -> μ TimeSpec) -> IO TimeSpec -> μ TimeSpec
forall a b. (a -> b) -> a -> b
$ TimeSpec -> (Ptr TimeSpec -> IO TimeSpec) -> IO TimeSpec
forall a b. Storable a => a -> (Ptr a -> IO b) -> IO b
with TimeSpec
ts ((Ptr TimeSpec -> IO TimeSpec) -> IO TimeSpec)
-> (Ptr TimeSpec -> IO TimeSpec) -> IO TimeSpec
forall a b. (a -> b) -> a -> b
$ \Ptr TimeSpec
pTs →
(Ptr TimeSpec -> IO TimeSpec) -> IO TimeSpec
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr TimeSpec -> IO TimeSpec) -> IO TimeSpec)
-> (Ptr TimeSpec -> IO TimeSpec) -> IO TimeSpec
forall a b. (a -> b) -> a -> b
$ \Ptr TimeSpec
pLeft → do
CInt
result ← Clock -> CInt -> Ptr TimeSpec -> Ptr TimeSpec -> IO CInt
c_clock_nanosleep Clock
clock CInt
0 Ptr TimeSpec
pTs Ptr TimeSpec
pLeft
if CInt
result CInt -> CInt -> Bool
forall a. Eq a => a -> a -> Bool
== CInt
0
then TimeSpec -> IO TimeSpec
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return TimeSpec
0
else do
Errno
errno ← IO Errno
getErrno
if Errno
errno Errno -> Errno -> Bool
forall a. Eq a => a -> a -> Bool
== Errno
eINTR
then Ptr TimeSpec -> IO TimeSpec
forall a. Storable a => Ptr a -> IO a
peek Ptr TimeSpec
pLeft
else String -> IO TimeSpec
forall a. String -> IO a
throwErrno String
"clockSleep"
clockSleepAbs ∷ MonadBase IO μ ⇒ Clock → TimeSpec → μ ()
clockSleepAbs :: forall (μ :: * -> *). MonadBase IO μ => Clock -> TimeSpec -> μ ()
clockSleepAbs Clock
clock TimeSpec
ts =
IO () -> μ ()
forall α. IO α -> μ α
forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α
liftBase (IO () -> μ ()) -> IO () -> μ ()
forall a b. (a -> b) -> a -> b
$ TimeSpec -> (Ptr TimeSpec -> IO ()) -> IO ()
forall a b. Storable a => a -> (Ptr a -> IO b) -> IO b
with TimeSpec
ts ((Ptr TimeSpec -> IO ()) -> IO ())
-> (Ptr TimeSpec -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr TimeSpec
p →
String -> IO CInt -> IO ()
forall a. (Eq a, Num a) => String -> IO a -> IO ()
throwErrnoIfMinus1_ String
"clockSleepAbs" (IO CInt -> IO ()) -> IO CInt -> IO ()
forall a b. (a -> b) -> a -> b
$
Clock -> CInt -> Ptr TimeSpec -> Ptr TimeSpec -> IO CInt
c_clock_nanosleep Clock
clock CInt
1 Ptr TimeSpec
p Ptr TimeSpec
forall a. Ptr a
nullPtr
{-# LINE 260 "src/System/Posix/Clock.hsc" #-}
foreign import ccall unsafe "clock_getcpuclockid"
c_clock_getcpuclockid ∷ ProcessID → Ptr Clock → IO CInt
foreign import ccall unsafe "clock_getres"
c_clock_getres ∷ Clock → Ptr TimeSpec → IO CInt
foreign import ccall unsafe "clock_gettime"
c_clock_gettime ∷ Clock → Ptr TimeSpec → IO CInt
foreign import ccall unsafe "clock_settime"
c_clock_settime ∷ Clock → Ptr TimeSpec → IO CInt
foreign import ccall "clock_nanosleep"
c_clock_nanosleep ∷ Clock → CInt → Ptr TimeSpec → Ptr TimeSpec → IO CInt