
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