On Saturday, 3 September 2022 at 14:31:31 UTC, Steven Schveighoffer wrote:
On 9/3/22 9:35 AM, frame wrote:

What happens if a manually `GC.free()` is called while the forked process marks the memory as free too but the GC immediately uses the memory again and then gets the notification to free it from the forked child? Can this happen?

No, because if you can free it, you should have had a reference to it when you forked, which should mean it's not garbage.

And what if the programmer has no actual reference but wrongly forced a `free()` through a pointer cast?

```
        | OP      | Memory M
-------------------------------------------
Parent: | -       | Unreferenced, marked in use
-------------------------------------------
Parent: | fork
-------------------------------------------
Parent: | -       | Unreferenced, marked in use
Child:  |         | Unreferenced, marked in use
-------------------------------------------
Parent: | -       | Unreferenced, marked in use
Child:  |         | Unreferenced, found M
-------------------------------------------
Parent: | free | Unreferenced, marked not in use <- error forced by programmer
Child:  |         | Unreferenced, found M
-------------------------------------------
Parent: | new     | Referenced, re-used because it was marked free
Child:  |         | Unreferenced, found M
-------------------------------------------
Parent: | -       | Referenced, used
Child:  |         | Done scanning. Please collect: M
-------------------------------------------
Parent: | collect | M
Child:  |         | exit
-------------------------------------------
```
@wjoe is the GC aware of this to exclude M from the child result set because it has changed while the child was running?

There's a talk on it from the 2013 dconf by the inventor: https://dconf.org/2013/talks/lucarella.html

-Steve

Thanks for the link. The slides mentioning shared memory.

Reply via email to