[MLton] MLton.GC.collect hangs when using MLton.Finalizable
Matthew Fluet
fluet at tti-c.org
Sat Feb 17 15:39:58 PST 2007
Wesley W. Terpstra wrote:
> On Feb 17, 2007, at 3:18 PM, Matthew Fluet wrote:
>> The "bug" is in your usage of Finalizable
> I agree, but I think the bug is that the Ring is not thread-safe. The
> fact that it could unlink at any time is fine.
>
>> But, you immediately drop all references to the *container* b, so at
>> any time, the finalizer could run, and remove b' from the ring.
> Which is what I wanted to happen. The "problem" was that MLton reordered
> instructions so that the end-of-ring reference was formed before the GC
> call which preceded it (and should remove it).
I haven't looked at the intermediate code, but fetching the end-of-ring
reference requires dereferencing the prev reference, which is not a pure
operation (it depends on the program state). The point being that MLton
never common subexpression eliminates an impure operation.
>> In particular, the finalizer could run *during* the loop in fold;
>> where it removes the end-of-ring reference, leaving fold to run in an
>> an infinite loop.
> That's not what was happening... However, I fully agree this was a
> latent bug, closed by adding MLton.Thread.atomically.
So, I agree that MLton.Thread.atomically prevents the finalizer from
deleting a link while executing the fold. But, I don't see why adding
MLton.Thread.atomically would eliminate the Overflow exception if the
end-of-ring reference were taken before the MLton.GC.collect.
More information about the MLton
mailing list