X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=Foreign%2FForeignPtr.hs;h=160bf3c99948c3424a629abbb2f0d768db7bc622;hb=4892d9c37de7e9d9b0c880ddf5ff0addbf0d0deb;hp=53275c10a2ea02e2ba29391721f0e104da979a79;hpb=086fb46b8ac94df6b3aef6873a8e8e277ca7a687;p=haskell-directory.git diff --git a/Foreign/ForeignPtr.hs b/Foreign/ForeignPtr.hs index 53275c1..160bf3c 100644 --- a/Foreign/ForeignPtr.hs +++ b/Foreign/ForeignPtr.hs @@ -20,14 +20,14 @@ module Foreign.ForeignPtr -- * Finalised data pointers ForeignPtr , FinalizerPtr -#ifdef __HUGS__ +#if defined(__HUGS__) || defined(__GLASGOW_HASKELL__) , FinalizerEnvPtr #endif -- ** Basic operations , newForeignPtr , newForeignPtr_ , addForeignPtrFinalizer -#ifdef __HUGS__ +#if defined(__HUGS__) || defined(__GLASGOW_HASKELL__) , newForeignPtrEnv , addForeignPtrFinalizerEnv #endif @@ -138,7 +138,7 @@ withForeignPtr fo io return r #endif /* ! __NHC__ */ -#ifdef __HUGS__ +#if defined(__HUGS__) || defined(__GLASGOW_HASKELL__) -- | 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 @@ -151,6 +151,24 @@ newForeignPtrEnv finalizer env p return fObj #endif /* __HUGS__ */ +#ifdef __GLASGOW_HASKELL__ +type FinalizerEnvPtr env a = FunPtr (Ptr env -> Ptr a -> IO ()) + +-- | like 'addForeignPtrFinalizerEnv' but allows the finalizer to be +-- passed an additional environment parameter to be passed to the +-- finalizer. The environment passed to the finalizer is fixed by the +-- second argument to 'addForeignPtrFinalizerEnv' +addForeignPtrFinalizerEnv :: + FinalizerEnvPtr env a -> Ptr env -> ForeignPtr a -> IO () +addForeignPtrFinalizerEnv finalizer env fptr = + addForeignPtrConcFinalizer fptr + (mkFinalizerEnv finalizer env (unsafeForeignPtrToPtr fptr)) + +foreign import ccall "dynamic" + mkFinalizerEnv :: FinalizerEnvPtr env a -> Ptr env -> Ptr a -> IO () +#endif + + #ifndef __GLASGOW_HASKELL__ mallocForeignPtr :: Storable a => IO (ForeignPtr a) mallocForeignPtr = do