X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=Foreign%2FMarshal%2FAlloc.hs;h=bbc2b98ef20c5bd7db86efad9bd259b5a5561849;hb=98daa4a448e019083d52ccec219a912021a0bfb0;hp=19cce12581ab69fd8ac783525923055b1017e08a;hpb=18ddadf0b8e35084a51f2560c3fe24ca8a2f3fea;p=ghc-base.git diff --git a/Foreign/Marshal/Alloc.hs b/Foreign/Marshal/Alloc.hs index 19cce12..bbc2b98 100644 --- a/Foreign/Marshal/Alloc.hs +++ b/Foreign/Marshal/Alloc.hs @@ -9,7 +9,29 @@ -- Stability : provisional -- Portability : portable -- --- Marshalling support: basic routines for memory allocation +-- The module "Foreign.Marshal.Alloc" provides operations to allocate and +-- deallocate blocks of raw memory (i.e., unstructured chunks of memory +-- outside of the area maintained by the Haskell storage manager). These +-- memory blocks are commonly used to pass compound data structures to +-- foreign functions or to provide space in which compound result values +-- are obtained from foreign functions. +-- +-- If any of the allocation functions fails, a value of 'nullPtr' is +-- produced. If 'free' or 'reallocBytes' is applied to a memory area +-- that has been allocated with 'alloca' or 'allocaBytes', the +-- behaviour is undefined. Any further access to memory areas allocated with +-- 'alloca' or 'allocaBytes', after the computation that was passed to +-- the allocation function has terminated, leads to undefined behaviour. Any +-- further access to the memory area referenced by a pointer passed to +-- 'realloc', 'reallocBytes', or 'free' entails undefined +-- behaviour. +-- +-- All storage allocated by functions that allocate based on a /size in bytes/ +-- must be sufficiently aligned for any of the basic foreign types +-- that fits into the newly allocated storage. All storage allocated by +-- functions that allocate based on a specific type must be sufficiently +-- aligned for that type. Array allocation routines need to obey the same +-- alignment constraints for each array element. -- ----------------------------------------------------------------------------- @@ -18,6 +40,7 @@ module Foreign.Marshal.Alloc ( -- ** Local allocation alloca, -- :: Storable a => (Ptr a -> IO b) -> IO b allocaBytes, -- :: Int -> (Ptr a -> IO b) -> IO b + allocaBytesAligned, -- :: Int -> Int -> (Ptr a -> IO b) -> IO b -- ** Dynamic allocation malloc, -- :: Storable a => IO (Ptr a) @@ -40,7 +63,7 @@ import Foreign.Ptr ( Ptr, nullPtr, FunPtr ) #ifdef __GLASGOW_HASKELL__ import Foreign.ForeignPtr ( FinalizerPtr ) -import GHC.IOBase +import GHC.IO.Exception import GHC.Real import GHC.Ptr import GHC.Err @@ -70,6 +93,7 @@ import Hugs.ForeignPtr ( FinalizerPtr ) -- The memory may be deallocated using 'free' or 'finalizerFree' when -- no longer required. -- +{-# INLINE malloc #-} malloc :: Storable a => IO (Ptr a) malloc = doMalloc undefined where @@ -93,6 +117,7 @@ mallocBytes size = failWhenNULL "malloc" (_malloc (fromIntegral size)) -- The memory is freed when @f@ terminates (either normally or via an -- exception), so the pointer passed to @f@ must /not/ be used after this. -- +{-# INLINE alloca #-} alloca :: Storable a => (Ptr a -> IO b) -> IO b alloca = doAlloca undefined where