On Monday, 17 August 2015 at 19:38:21 UTC, Steven Schveighoffer
wrote:
On 8/17/15 3:27 PM, Benjamin Thaut wrote:
Consider the following code
void* mem = malloc(500);
GC.addRange(mem, 500);
mem = realloc(mem, 512); // assume the pointer didn't change
GC.removeRange(mem);
This is actually unsafe, you have to remove the range first, or
else if it *does* change the pointer, your GC is using free'd
memory. Plus, if it does change the pointer, how do you remove
the original range?
I specifically asked for the case where the pointer doesn't
change. Obvisouly the case where it does change is easy, you
first add the new range and then remove the old one. But if you
do this and the pointer didn't change, the addRange doesn't do
anything because its a duplicate and the removeRange then removes
the range, because the pointer is still the same. You then end up
with the GC not knowing anything about the range anymore.
// if the GC kicks in here we're f*****
GC.addRange(mem, 512);
Can't you GC.disable around this whole thing?
-Steve
Yes, this would work, but It seems kind of broken to me, that you
have to make 4 API Calls to the gc to handle something as simple
as a realloc.
Kind Regards
Benjamin Thaut