Soundness of thunk update?
I am beginning to have second thoughts on whether the thunk update protocol we currently use (see `Note [Heap memory barriers]` in `SMP.h`) is safe on weakly ordered platforms. The problem is that lazy blackholing may mean that multiple threads race to update a thunk, resulting in a value being exposed via an indirection before being made available to other cores.
Specifically, I am worried about interleavings like the following (where `t` is a thunk being updated and `a` and `b` are two evaluation results):
```
Thread A Thread B Thread C
--------- --------- ---------
t.indirectee=a
t.indirectee=b
release fence
t.info=BLACKHOLE
read t.info
inspect t.indirectee
release fence
t.info=BLACKHOLE
```
Specifically, we see here that Thread A writes its result, `a` to the indirectee. Typically, the soundness of the update of the `indirectee` field is guaranteed by the release ordering of the `t.info=BLACKHOLE` store, guaranteeing that `a` is visible to readers when the closure becomes a blackhole.
However, in this case Thread B races to update `indirectee`, storing its own result `b`. Meanwhile, thread `C` enters `t` (which is now a blackhole), inspects `t.indirectee`, and is therefore exposed to `b` before Thread B has guaranteed that it is visible.
This seems like an extrodinarily narrow race, but AFAICT it's a race nevertheless.
issue