Rules for use of unsafeThaw...

Jan-Willem Maessen jmaessen at
Thu Nov 3 12:08:09 EST 2005

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

More information about the Glasgow-haskell-users mailing list