
I've recently been experimenting with unsafeFreeze/unsafeThaw in GHC. Judicious use of these functions vastly reduces GC overhead in Data.HashTable. However, a slightly mis-timed GC will cause the whole mess to crash. I am attempting to understand the invariants required to safely use unsafeFreeze/unsafeThaw. I believe the following usage ought to be 100% safe: 1) Take the last and only reference to a mutable array, and call unsafeFreeze to obtain an immutable array. 2) Take the last and only reference to an immutable array, and call unsafeThaw to obtain a mutable array. Are there any other usage modes which are GC-safe? In particular, is it possible for a reference to the frozen array to exist somewhere on the heap when a call to unsafeThaw occurs? Is there a particular set of circumstances under which we might get away with this (eg, no allocation during the interval where the ambiguous references occur)? -Jan-Willem Maessen