FFI Ptr question

paul@theV.net paul@theV.net
Thu, 3 Jul 2003 15:04:26 +0800


On Thu, Jul 03, 2003 at 01:40:46AM -0400, Derek Elkins wrote:
> On Thu, 3 Jul 2003 11:34:08 +0800
> paul@theV.net wrote:
> 
> > If a C function returns a (void*), let's say:
> > 
> > data MyObj = MyObj
> > 
> > foreign import ccall "static myobj_ffi.h new_obj" newMyObject :: IO
> > (Ptr MyObj)
> > 
> > ptr <- newMyObject
> > 
> > should I free the ptr afterwards or not?
> 
> Assuming that it should be freed even in C and nothing else is managing
> it then I believe the answer is yes.  You can use a finalizer
> to do it.

The wierd thing is, I cannot use the the function
Foreign.Marshal.Alloc.free to free the ptr. I must
use my own C function to do a simple free() call.

> > If I have another imported C function:
> > 
> > foreign import ccall "static myobj_ffi.h print_obj" printMyObject ::
> > Ptr MyObj -> IO ()
> > 
> > Can I safely assume the C function print_obj(void *) always get the
> > same pointer even if I call (printMyObject ptr) multiple times?
> 
> What other pointer would it pass?

The same Haskell ptr. I wonder if they'll ever change after
creation.

My question is, if Ptr is equivalent to a raw void* pointer in 
C, and pointers created in foreign language (which is later
passed to Haskell as Ptr) has to be freed in the foreign
language, then can I safely assume that Ptr isn't affected
by Haskell's GC cycle? And what the real difference between Ptr
and StablePtr?

Regards,
.paul.