Hi Evan, Ed,

On Jul 12, 2010, at 22:53, Edward Z. Yang wrote:

Excerpts from Evan Laforge's message of Mon Jul 12 16:43:45 -0400 2010:
Yeah, that's definitely the safest and simplest.  But the copying
defeats the purpose of passing a pointer in the first place, which was
to not have to copy the giant array just to pass it.

Well, if your C code wasn't squirreling away the pointer, you could have avoided the copy. Memory copies in C are suprisingly cheap; I'm really surprised how often I see memcpy() in high performance code (though, it may be the case that the details of the algorithm are a much more important influence
on performance.)

If your C code has a way to properly unref a pointer then you could wrap your ForeignPtr in a StablePtr and pass that to C land. Once C has freed the StablePtr the ForeignPtr can become dead when Haskell has dropped all references and it will be garbage collected.

The downside is that your C code needs to hold the StablePtr and do the accesses through the Ptr in the ForeignPtr, so it needs to be able to store two pointers at once.

Axel

_______________________________________________
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to