ajhc-0.8.0.6: lib/haskell-extras/Foreign/StablePtr.hs
{-# OPTIONS_JHC -fno-prelude -fffi -funboxed-tuples #-}
module Foreign.StablePtr(
StablePtr(),
castStablePtrToPtr,
castPtrToStablePtr,
newStablePtr,
deRefStablePtr,
freeStablePtr
) where
import Jhc.Prim.Rts
import Jhc.IO
import Jhc.Type.Ptr
import Jhc.Basics
data StablePtr a
castPtrToStablePtr :: Ptr () -> StablePtr a
castPtrToStablePtr (Ptr (Addr_ p)) = fromBang_ (bangFromRaw p)
castStablePtrToPtr :: StablePtr a -> Ptr ()
castStablePtrToPtr p = Ptr (Addr_ (bangToRaw (toBang_ p)))
freeStablePtr :: StablePtr a -> IO ()
freeStablePtr p = c_freeStablePtr (toBang_ p)
-- | newStablePtr will seq its argument to get rid of nasty GC issues and be
-- compatible with FFI calling conventions, if this is an issue, you can put an
-- extra box around it.
newStablePtr :: a -> IO (StablePtr a)
newStablePtr x = do
fromUIO $ \w -> case c_newStablePtr (toBang_ x) w of
(# w', s #) -> (# w', fromBang_ s #)
deRefStablePtr :: StablePtr a -> IO a
deRefStablePtr x = do
fromUIO $ \w -> case c_derefStablePtr (toBang_ x) w of
(# w', s #) -> (# w', fromBang_ s #)
foreign import ccall unsafe "rts/stableptr.h c_freeStablePtr" c_freeStablePtr :: Bang_ (StablePtr a) -> IO ()
foreign import ccall unsafe "rts/stableptr.h c_newStablePtr" c_newStablePtr :: Bang_ a -> UIO (Bang_ (StablePtr a))
foreign import ccall unsafe "rts/stableptr.h c_derefStablePtr" c_derefStablePtr :: Bang_ (StablePtr a) -> UIO (Bang_ a)