X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=Foreign%2FForeignPtr.hs;h=a0bccf59b8564c2c97ca2a74ad82ee14948934d6;hb=e0b4718ee302c4349eb892369b63098bc1e02488;hp=af39a61aac5db10c0d45237270d99caf9d56d0d4;hpb=d539a9457e2c79a9f13744d073d3f253ea2fb33e;p=ghc-base.git diff --git a/Foreign/ForeignPtr.hs b/Foreign/ForeignPtr.hs index af39a61..a0bccf5 100644 --- a/Foreign/ForeignPtr.hs +++ b/Foreign/ForeignPtr.hs @@ -20,14 +20,29 @@ module Foreign.ForeignPtr -- * Finalised data pointers ForeignPtr , FinalizerPtr +#ifdef __HUGS__ + , FinalizerEnvPtr +#endif + -- ** Basic operations , newForeignPtr , newForeignPtr_ , addForeignPtrFinalizer +#ifdef __HUGS__ + , newForeignPtrEnv + , addForeignPtrFinalizerEnv +#endif , withForeignPtr + +#ifdef __GLASGOW_HASKELL__ + , finalizeForeignPtr +#endif + + -- ** Low-level operations , unsafeForeignPtrToPtr , touchForeignPtr , castForeignPtr + -- ** Allocating managed memory , mallocForeignPtr , mallocForeignPtrBytes , mallocForeignPtrArray @@ -88,7 +103,7 @@ instance Show (ForeignPtr a) where #ifndef __NHC__ -newForeignPtr :: Ptr a -> FinalizerPtr a -> IO (ForeignPtr a) +newForeignPtr :: FinalizerPtr a -> Ptr 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 @@ -96,9 +111,9 @@ newForeignPtr :: Ptr a -> FinalizerPtr a -> IO (ForeignPtr a) -- 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 +newForeignPtr finalizer p = do fObj <- newForeignPtr_ p - addForeignPtrFinalizer fObj finalizer + addForeignPtrFinalizer finalizer fObj return fObj withForeignPtr :: ForeignPtr a -> (Ptr a -> IO b) -> IO b @@ -111,7 +126,7 @@ withForeignPtr :: ForeignPtr a -> (Ptr a -> IO b) -> IO b -- the action and use it after the action completes. All uses -- of the pointer should be inside the -- 'withForeignPtr' bracket. The reason for --- this unsafety is the same as for +-- this unsafeness is the same as for -- 'unsafeForeignPtrToPtr' below: the finalizer -- may run earlier than expected, because the compiler can only -- track usage of the 'ForeignPtr' object, not @@ -127,23 +142,44 @@ withForeignPtr fo io return r #endif /* ! __NHC__ */ +#ifdef __HUGS__ +-- | This variant of 'newForeignPtr' adds a finalizer that expects an +-- environment in addition to the finalized pointer. The environment +-- that will be passed to the finalizer is fixed by the second argument to +-- 'newForeignPtrEnv'. +newForeignPtrEnv :: + FinalizerEnvPtr env a -> Ptr env -> Ptr a -> IO (ForeignPtr a) +newForeignPtrEnv finalizer env p + = do fObj <- newForeignPtr_ p + addForeignPtrFinalizerEnv finalizer env fObj + return fObj +#endif /* __HUGS__ */ + #ifndef __GLASGOW_HASKELL__ mallocForeignPtr :: Storable a => IO (ForeignPtr a) mallocForeignPtr = do r <- malloc - newForeignPtr r finalizerFree + newForeignPtr finalizerFree r mallocForeignPtrBytes :: Int -> IO (ForeignPtr a) mallocForeignPtrBytes n = do r <- mallocBytes n - newForeignPtr r finalizerFree -#endif /* __HUGS__ || __NHC__ */ + newForeignPtr finalizerFree r +#endif /* !__GLASGOW_HASKELL__ */ +-- | This function is similar to 'Foreign.Marshal.Array.mallocArray', +-- but yields a memory area that has a finalizer attached that releases +-- the memory area. As with 'mallocForeignPtr', it is not guaranteed that +-- the block of memory was allocated by 'Foreign.Marshal.Alloc.malloc'. mallocForeignPtrArray :: Storable a => Int -> IO (ForeignPtr a) mallocForeignPtrArray = doMalloc undefined where doMalloc :: Storable a => a -> Int -> IO (ForeignPtr a) doMalloc dummy size = mallocForeignPtrBytes (size * sizeOf dummy) +-- | This function is similar to 'Foreign.Marshal.Array.mallocArray0', +-- but yields a memory area that has a finalizer attached that releases +-- the memory area. As with 'mallocForeignPtr', it is not guaranteed that +-- the block of memory was allocated by 'Foreign.Marshal.Alloc.malloc'. mallocForeignPtrArray0 :: Storable a => Int -> IO (ForeignPtr a) mallocForeignPtrArray0 size = mallocForeignPtrArray (size + 1)