On 2015-03-15 15:57:43 +0000, Marc Schütz said:

Ok. I need to dig into how the interpreter handles the returned pointer and how the stack is handled.

C usually uses manual memory management, therefore I would expect that the interpreter actually documents whom the pointer belongs to, and who is responsible for cleaning it up.

What I'm trying to understand is how the returned pointer is used and when the GC can kick in.

I tracked the return code from the DLL. The returned pointer is returned in EAX register (conforming to the C calling convention). Then the interpreter uses this pointer for some time (in my case to create a copy).

It than continues, and at some point the EAX register gets some other value. This is the point, wher no reference to the D GC allocated memory can anylonger be found. Hence the GC should be free to free the memory.

If the interpreter takes ownership, you should just allocate the data with malloc(), and the interpreter will then call free() on it when it doesn't need it any longer. Not sure whether .dup is compatible with that, maybe you'd need to write a small helper that copies things to the C heap.

Yes, exactly. And the problem is, that it's not clear to me (yet) when the interpreter takes ownership and when not.

Am I right, that I can query() the D GC to check if a pointer is known / can be found or not?

It would be cool if I could query D from the interpreter and ask: "Will this pointer be freed in the next collector run?" and get back: Yes, or "already has been".

--
Robert M. Münch
http://www.saphirion.com
smarter | better | faster

Reply via email to