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.