Added finalizeForeignPtr function
+#ifdef __GLASGOW_HASKELL__
+ , finalizeForeignPtr
+#endif
+
-- ** Low-level operations
, unsafeForeignPtrToPtr
, touchForeignPtr
-- ** Low-level operations
, unsafeForeignPtrToPtr
, touchForeignPtr
castForeignPtr,
newConcForeignPtr,
addForeignPtrConcFinalizer,
castForeignPtr,
newConcForeignPtr,
addForeignPtrConcFinalizer,
) where
import Control.Monad ( sequence_ )
) where
import Control.Monad ( sequence_ )
-- ^This function casts a 'ForeignPtr'
-- parameterised by one type into another type.
castForeignPtr f = unsafeCoerce# f
-- ^This function casts a 'ForeignPtr'
-- parameterised by one type into another type.
castForeignPtr f = unsafeCoerce# f
+
+-- | Causes a the finalizers associated with a foreign pointer to be run
+-- immediately.
+finalizeForeignPtr :: ForeignPtr a -> IO ()
+finalizeForeignPtr foreignPtr = do
+ finalizers <- readIORef refFinalizers
+ sequence_ finalizers
+ writeIORef refFinalizers []
+ where
+ refFinalizers = case foreignPtr of
+ (ForeignPtr _ ref) -> ref
+ (MallocPtr _ ref) -> ref