Version 2 (modified by Stefan O'Rear, 10 years ago) (diff)

add bangs before types that shouldn't have been links

Interaction between GMP and the Storage Manager

The Glasgow Haskell Compiler uses GMP to implement Integer. GMP expects a storage model where pointers (newtyped as mpz_t) are explicitly allocated and freed. However, Haskell requires Integers to be garbage collected. This could be done with ForeignPtrs, however (presumably for performance reasons?) GHC uses ByteArray#s from the heap instead. rts/sm/Storage.c initStorage sets three override functions to do this: stgAllocForGMP, stgReallocForGMP, and stgDeallocForGMP.

This requires a fairly subtle interaction in order to work safely, because heap ByteArray#s are normal objects and can be moved by garbage collection. The important thing to note is that the GHC garbage collector is of the stop-the-world variety. This means that all threads must reach a synchronization point before garbage collection can actually begin. However, there are no such synchronization points inside the GMP-based primops. Therefore, garbage collection, and consequent moving of Integers, can only occur when no GMP operations are executing.