X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=Foreign%2FMarshal%2FAlloc.hs;h=3cf7174786ff1064877ebd05a1fbc70525874f2a;hb=1db1d1749368c00079a1c764c9709908c2a92510;hp=1687c82f6fe8ebcc6c67dccd933ed028a2ce9633;hpb=6e9831fee1a4f0523bccf3ff8873fc9677f871d6;p=ghc-base.git diff --git a/Foreign/Marshal/Alloc.hs b/Foreign/Marshal/Alloc.hs index 1687c82..3cf7174 100644 --- a/Foreign/Marshal/Alloc.hs +++ b/Foreign/Marshal/Alloc.hs @@ -24,21 +24,31 @@ module Foreign.Marshal.Alloc ( 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 @@ -140,6 +150,10 @@ failWhenNULL name f = do -- 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