, touchForeignPtr
, castForeignPtr
-#ifndef __NHC__
, mallocForeignPtr
, mallocForeignPtrBytes
, mallocForeignPtrArray
, mallocForeignPtrArray0
-#endif
)
where
( ForeignPtr
, FinalizerPtr
, newForeignPtr
+ , newForeignPtr_
, addForeignPtrFinalizer
, withForeignPtr
, unsafeForeignPtrToPtr
, touchForeignPtr
, castForeignPtr
+ , Storable(sizeOf)
+ , malloc, mallocBytes, finalizerFree
)
#endif
#if !defined(__NHC__) && !defined(__GLASGOW_HASKELL__)
import Foreign.Marshal.Alloc ( malloc, mallocBytes, finalizerFree )
-import Data.Dynamic
+import Data.Typeable
-#include "Dynamic.h"
+#include "Typeable.h"
INSTANCE_TYPEABLE1(ForeignPtr,foreignPtrTc,"ForeignPtr")
instance Eq (ForeignPtr a) where
#ifndef __NHC__
+newForeignPtr :: Ptr a -> FinalizerPtr a -> IO (ForeignPtr a)
+-- ^Turns a plain memory reference into a foreign pointer, and
+-- associates a finaliser with the reference. The finaliser will be executed
+-- after the last reference to the foreign object is dropped. Note that there
+-- is no guarantee on how soon the finaliser is executed after the last
+-- reference was dropped; this depends on the details of the Haskell storage
+-- manager. The only guarantee is that the finaliser runs before the program
+-- terminates.
+newForeignPtr p finalizer
+ = do fObj <- newForeignPtr_ p
+ addForeignPtrFinalizer fObj finalizer
+ return fObj
+
withForeignPtr :: ForeignPtr a -> (Ptr a -> IO b) -> IO b
-- ^This is a way to look at the pointer living inside a
-- foreign object. This function takes a function which is
return r
#endif /* ! __NHC__ */
-#ifdef __HUGS__
--- temporary aliasing until hugs catches up
-unsafeForeignPtrToPtr = foreignPtrToPtr
-#endif
-
-#ifdef __HUGS__
+#ifndef __GLASGOW_HASKELL__
mallocForeignPtr :: Storable a => IO (ForeignPtr a)
mallocForeignPtr = do
r <- malloc
mallocForeignPtrBytes n = do
r <- mallocBytes n
newForeignPtr r finalizerFree
-#endif /* __HUGS__ */
+#endif /* __HUGS__ || __NHC__ */
-#ifndef __NHC__
mallocForeignPtrArray :: Storable a => Int -> IO (ForeignPtr a)
mallocForeignPtrArray = doMalloc undefined
where
mallocForeignPtrArray0 :: Storable a => Int -> IO (ForeignPtr a)
mallocForeignPtrArray0 size = mallocForeignPtrArray (size + 1)
-#endif