    {-# LANGUAGE Safe #-}

    -- |
    --
    -- Module      :  Foreign.Marshal.Alloc
    -- Copyright   :  (c) The FFI task force 2001
    -- License     :  BSD-style (see the file libraries/base/LICENSE)
    --
    -- Maintainer  :  ffi@haskell.org
    -- Stability   :  provisional
    -- Portability :  portable
    --
    -- 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, an exception is thrown.
    -- In some cases, memory exhaustion may mean the process is terminated.
    -- 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.
    --
    -- The underlying implementation is wrapping the @<stdlib.h>@
    -- @malloc@, @realloc@, and @free@.
    -- In other words it should be safe to allocate using C-@malloc@,
    -- and free memory with 'free' from this module.
    --

    module Foreign.Marshal.Alloc
        (-- *  Memory allocation
         -- **  Local allocation
         alloca,
         allocaBytes,
         allocaBytesAligned,
         -- **  Dynamic allocation
         malloc,
         mallocBytes,
         calloc,
         callocBytes,
         realloc,
         reallocBytes,
         free,
         finalizerFree
         ) where

    import GHC.Internal.Foreign.Marshal.Alloc