I am trying to get sticky immix working on our moving branch mmtk-support-moving-upstream, and observed the following bug:
- Create task X in the non-moving space
- X is added to
all_tasks.
- Nursery GC happens.
- X is not in the nursery space, and is not traced. X is not marked.
- At the end of the GC, we sweep
all_tasks by checking is_live() with MMTk. MMTk calls is_live() for the space. X is in the non-moving Immix space which decides liveness based on the mark. X is not marked, thus gets removed from all_tasks.
- New roots are pushed to X's shadow stack with no write barrier. So X is not in the mod buffer either.
- Nursery GC happens.
- X is not in
all_tasks. We won't scan its shadow stack and the new roots will not be scanned properly.
- X is not in the nursery space, nor the mod buffer. So it not traced or scanned.
- New roots become dead.
I think the issue is that is_live() should not return false for X whose liveness is actually unknown. See mmtk/mmtk-core#1422
I am trying to get sticky immix working on our moving branch
mmtk-support-moving-upstream, and observed the following bug:all_tasks.all_tasksby checkingis_live()with MMTk. MMTk callsis_live()for the space. X is in the non-moving Immix space which decides liveness based on the mark. X is not marked, thus gets removed fromall_tasks.all_tasks. We won't scan its shadow stack and the new roots will not be scanned properly.I think the issue is that
is_live()should not returnfalsefor X whose liveness is actually unknown. See mmtk/mmtk-core#1422