realloc, -- :: Storable b => Ptr a -> IO (Ptr b)
reallocBytes, -- :: Ptr a -> Int -> IO (Ptr a)
- free -- :: Ptr a -> IO ()
+ free, -- :: Ptr a -> IO ()
+ finalizerFree -- :: FinalizerPtr a
) where
import Data.Maybe
-import Foreign.Ptr ( Ptr, nullPtr )
-import Foreign.C.TypesISO ( CSize )
+import Foreign.Ptr ( Ptr, nullPtr, FunPtr )
+import Foreign.C.Types ( CSize )
import Foreign.Storable ( Storable(sizeOf) )
#ifdef __GLASGOW_HASKELL__
-import GHC.Exception ( bracket )
+import Foreign.ForeignPtr ( FinalizerPtr )
import GHC.IOBase
import GHC.Real
import GHC.Ptr
import GHC.Err
import GHC.Base
+#elif defined(__NHC__)
+import NHC.FFI ( FinalizerPtr, CInt(..) )
+import IO ( bracket )
+#else
+import Control.Exception ( bracket )
+#endif
+
+#ifdef __HUGS__
+import Hugs.ForeignPtr ( FinalizerPtr )
#endif
-- basic C routines needed for memory allocation
--
-foreign import ccall unsafe "malloc" _malloc :: CSize -> IO (Ptr a)
-foreign import ccall unsafe "realloc" _realloc :: Ptr a -> CSize -> IO (Ptr b)
-foreign import ccall unsafe "free" _free :: Ptr a -> IO ()
+foreign import ccall unsafe "stdlib.h malloc" _malloc :: CSize -> IO (Ptr a)
+foreign import ccall unsafe "stdlib.h realloc" _realloc :: Ptr a -> CSize -> IO (Ptr b)
+foreign import ccall unsafe "stdlib.h free" _free :: Ptr a -> IO ()
+
+-- | A pointer to a foreign function equivalent to 'free', which may be used
+-- as a finalizer for storage allocated with 'malloc' or 'mallocBytes'.
+foreign import ccall unsafe "stdlib.h &free" finalizerFree :: FinalizerPtr a