How to force finalization of ForeignPtr
Simon Marlow
simonmar at microsoft.com
Mon Dec 22 10:30:51 EST 2003
[ forwarded to ffi at haskell.org ]
> In the current implementation there is no way to
> force finalization of the foreign ptr if there are
> still references to it. In this scenario
> the finalization will be executed during the next
> garbage collection. In some cases it is known that the
> foreign pointer value is not used anymore but the
> references still exist in the stack and they cannot be
> freed from the collector. In such cases I want to be
> able to explicitly finalize the foreign pointers. For
> that reason I wrote the following simple function:
>
> module FinalizeForeignPtr(finalizeForeignPtr) where
>
> import GHC.ForeignPtr
> import Data.IORef
>
> 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
There's a race condition between multiple finalizeForeignPtrs, but apart
from that it looks fine.
I don't see any reason why we shouldn't have this. GHC's weak pointer
interface has a similar function for running the finalizer early.
Cheers,
Simon
More information about the Glasgow-haskell-users
mailing list