{-# LANGUAGE CPP #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE UnliftedFFITypes #-}
{-# OPTIONS_HADDOCK not-home #-}
module Effectful.Internal.Utils
( weakThreadId
, eqThreadId
, Any
, toAny
, fromAny
) where
import Foreign.C.Types
import GHC.Conc.Sync (ThreadId(..))
import GHC.Exts (Any, ThreadId#)
import Unsafe.Coerce (unsafeCoerce)
weakThreadId :: ThreadId -> Int
weakThreadId :: ThreadId -> Int
weakThreadId (ThreadId ThreadId#
t#) = CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CInt -> Int) -> CInt -> Int
forall a b. (a -> b) -> a -> b
$ ThreadId# -> CInt
rts_getThreadId ThreadId#
t#
foreign import ccall unsafe "rts_getThreadId"
#if __GLASGOW_HASKELL__ >= 903
rts_getThreadId :: ThreadId# -> CULLong
#elif __GLASGOW_HASKELL__ >= 900
rts_getThreadId :: ThreadId# -> CLong
#else
rts_getThreadId :: ThreadId# -> CInt
#endif
eqThreadId :: ThreadId -> ThreadId -> Bool
eqThreadId :: ThreadId -> ThreadId -> Bool
eqThreadId (ThreadId ThreadId#
t1#) (ThreadId ThreadId#
t2#) = ThreadId# -> ThreadId# -> CLong
eq_thread ThreadId#
t1# ThreadId#
t2# CLong -> CLong -> Bool
forall a. Eq a => a -> a -> Bool
== CLong
1
foreign import ccall unsafe "effectful_eq_thread"
eq_thread :: ThreadId# -> ThreadId# -> CLong
toAny :: a -> Any
toAny :: a -> Any
toAny = a -> Any
forall a b. a -> b
unsafeCoerce
fromAny :: Any -> a
fromAny :: Any -> a
fromAny = Any -> a
forall a b. a -> b
unsafeCoerce