RE: Ptr and ForeignPtr Questions

At 2001-09-20 02:14, Simon Marlow wrote:
I'll just add that the docs have been updated for 5.02,
Do you have a URL for that?
Not yet, but the release is imminent (really!) so it'll be up on the web site shortly.
And don't forget that using foreignPtrToPtr is quite dangerous; much better to use withForeignPtr instead, otherwise you might find the ForeignPtr being finalised earlier than you expect.
This is because foreignPtrToPtr is not in the IO monad, correct?
foreignPtrToPtr :: ForeignPtr a -> Ptr a;
A function like this:
ioForeignPtrToPtr :: ForeignPtr a -> IO (Ptr a); ioForeignPtrToPtr fp = withForeignPtr fp return;
...would surely be safe? The 5.00 documentation claims that it isn't, however, but I don't see why.
No, it's not safe. The reason is that the compiler can track a ForeignPtr to discover when it dies, in order to run the finalizer, but it can't track a Ptr. As soon as you drop all references to the ForeignPtr then the finalizer will run, even if you converted it to a Ptr and you're still using it. withForeignPtr is safe to use because it ensures that the ForeignPtr is kept live until it returns. The documentation is a little terse on this issue; I'll see if I can improve it. Cheers, Simon
participants (1)
-
Simon Marlow