X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;ds=inline;f=Foreign%2FForeignPtr.hs;h=160bf3c99948c3424a629abbb2f0d768db7bc622;hb=30464c0cb915c2ae900909568fa8677bba341e45;hp=50db97d7f919bfddad6e9e452e3937114c7f7bec;hpb=aaf764b3ad8b1816d68b5f27299eac125f08e1a5;p=haskell-directory.git diff --git a/Foreign/ForeignPtr.hs b/Foreign/ForeignPtr.hs index 50db97d..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 @@ -86,10 +86,6 @@ import GHC.ForeignPtr #if !defined(__NHC__) && !defined(__GLASGOW_HASKELL__) import Foreign.Marshal.Alloc ( malloc, mallocBytes, finalizerFree ) -import Data.Typeable - -#include "Typeable.h" -INSTANCE_TYPEABLE1(ForeignPtr,foreignPtrTc,"ForeignPtr") instance Eq (ForeignPtr a) where p == q = unsafeForeignPtrToPtr p == unsafeForeignPtrToPtr q @@ -142,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 @@ -155,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