1 {-# OPTIONS -fno-implicit-prelude #-}
2 -----------------------------------------------------------------------------
4 -- Module : Foreign.ForeignPtr
5 -- Copyright : (c) The University of Glasgow 2001
6 -- License : BSD-style (see the file libraries/core/LICENSE)
8 -- Maintainer : ffi@haskell.org
9 -- Stability : provisional
10 -- Portability : portable
12 -- This module defines foreign pointers, i.e. addresses with associated
15 -----------------------------------------------------------------------------
17 module Foreign.ForeignPtr
18 ( ForeignPtr, -- abstract, instance of: Eq
19 , newForeignPtr -- :: Ptr a -> IO () -> IO (ForeignPtr a)
20 , addForeignPtrFinalizer -- :: ForeignPtr a -> IO () -> IO ()
21 , withForeignPtr -- :: ForeignPtr a -> (Ptr a -> IO b) -> IO b
22 , foreignPtrToPtr -- :: ForeignPtr a -> Ptr a
23 , touchForeignPtr -- :: ForeignPtr a -> IO ()
24 , castForeignPtr -- :: ForeignPtr a -> ForeignPtr b
31 #ifdef __GLASGOW_HASKELL__
39 INSTANCE_TYPEABLE1(ForeignPtr,foreignPtrTc,"ForeignPtr")
41 #ifdef __GLASGOW_HASKELL__
42 data ForeignPtr a = ForeignPtr ForeignObj#
43 instance CCallable (ForeignPtr a)
45 eqForeignPtr :: ForeignPtr a -> ForeignPtr a -> Bool
46 eqForeignPtr (ForeignPtr fo1#) (ForeignPtr fo2#) = eqForeignObj# fo1# fo2#
48 instance Eq (ForeignPtr a) where
49 p == q = eqForeignPtr p q
50 p /= q = not (eqForeignPtr p q)
52 newForeignPtr :: Ptr a -> IO () -> IO (ForeignPtr a)
53 newForeignPtr p finalizer
54 = do fObj <- mkForeignPtr p
55 addForeignPtrFinalizer fObj finalizer
58 addForeignPtrFinalizer :: ForeignPtr a -> IO () -> IO ()
59 addForeignPtrFinalizer (ForeignPtr fo) finalizer =
60 IO $ \s -> case mkWeak# fo () finalizer s of { (# s1, w #) -> (# s1, () #) }
62 mkForeignPtr :: Ptr a -> IO (ForeignPtr a) {- not exported -}
63 mkForeignPtr (Ptr obj) = IO ( \ s# ->
64 case mkForeignObj# obj s# of
65 (# s1#, fo# #) -> (# s1#, ForeignPtr fo# #) )
67 touchForeignPtr :: ForeignPtr a -> IO ()
68 touchForeignPtr (ForeignPtr fo)
69 = IO $ \s -> case touch# fo s of s -> (# s, () #)
71 withForeignPtr :: ForeignPtr a -> (Ptr a -> IO b) -> IO b
73 = do r <- io (foreignPtrToPtr fo)
77 foreignPtrToPtr :: ForeignPtr a -> Ptr a
78 foreignPtrToPtr (ForeignPtr fo) = Ptr (foreignObjToAddr# fo)
80 castForeignPtr (ForeignPtr a) = ForeignPtr a