How to force finalization of ForeignPtr
Krasimir Angelov
ka2_mail at yahoo.com
Mon Dec 22 02:18:38 EST 2003
Dear GHC team,
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
The function uses the internal representation of the
foreign pointer. Is there any other way to do this or
I am missing something? If there is not any other way,
then I think that the right place for this function is
in the standard libraries.
Any suggestions will be welcomed!
Krasimir
__________________________________
Do you Yahoo!?
New Yahoo! Photos - easier uploading and sharing.
http://photos.yahoo.com/
More information about the Glasgow-haskell-users
mailing list