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