Either I'm confused or the gc is
Steven Schveighoffer
schveiguy at gmail.com
Mon Nov 16 21:25:03 UTC 2020
On 11/16/20 2:26 PM, H. S. Teoh wrote:
> On Sun, Nov 15, 2020 at 01:46:52PM -0800, Ali Çehreli via Digitalmars-d wrote:
> [...]
>> While I have everbody's attention, :) toStringz will come up during
>> one of my DConf presentations. I will claim that it is safe to pass to
>> a C function for their immediate consumption (but they can't save the
>> pointer).
>>
>> So, I will claim that the following is safe and no GC collection on
>> another thread can mess this up. (The C side is not allowed to store
>> for later use but they are taking the pointer into a local variable on
>> their function call stack.)
>>
>> nothrow extern(C) void bar(const(char) ** name) {
>> // ...
>> *name = makeString(42).toStringz;
>> // ...
>> }
> [...]
>
> AFAIK, as long as a reference exists on the stack, you should be safe,
> because the GC does scan the stack. But if the C side stores it
> anywhere else past the point where the on-stack reference goes out of
> scope, then you're in trouble.
I see a problem here, in that the stack is changeable by the C function.
I can imagine a situation where it removes the item from the stack to
put it somewhere else (e.g. global memory or on the C heap)
*temporarily*, and by the time the function exits, the pointer is no
longer in use in C-land. Thus, the function doesn't "save the pointer".
This kind of problem would still be susceptible to the GC collecting it
(via another thread), and so I would recommend still storing locally in
the calling function a copy of the pointer.
-Steve
More information about the Digitalmars-d
mailing list