When (iii.) fails
* If I'm the Main-thread, I'm in the middle of handling a failed forwarder-check
�� and can infer the GC-thread already did what I was going to do.��
�� I can be certain that... �� ��"object-slot == Rpointer" (since thats the only object-slot mutation GC-threads can do)
�� so its fine to continue to my usual post-flattening retry
* If I'm a GC-thread, either:��
�� �� ��* the Main-thread flattened the forwarder, or
�� �� ��* the Main-thread changed which object the slot holds
�� ��In either case, just re-read the slot
A race scenario to consider is where the Main-thread converts an object��
to a forwarder simultaneous with a GC-thread flattening one of its slots.
The object copy in its new location may miss that update.
But in terms of the object graph that seems not a problem, since the copy without that update is still consistent.
Infrequently just a little bit of work is lost.
I'm contemplating other race scenarios around marking, but won't distract with them for now.