GHC Dynamic Loading

Keean k.schupke@ic.ac.uk
Thu, 4 Apr 2002 10:13:46 +0100


I am trying to dynamically load a shared haskell module - and it almost
works... however as
soon as the grabage collector thread runs it frees/moves something and the
program falls over.
Presumably this means I need to use a StablePtr - however I have as yet been
unable to work out
what exactly is the cause. I was hoping somebody with some knowledge of th
einternals of GHC could
help me out...

The summary of what happens is:

	using FFI to call libdl on linux:

		- load module using dlopen (the library is compiled with -optl -shared and
the
			loader is compiled with -rdynamic, so after loading all static symbols
			should be resolved.)

		- using dlsym to get a FunPtr to a module initialiser.

		- passing a StablePtr to a (FiniteMap String (SomeFunction)) as well as a
dynamically exported
			continuation function (ie a "main-loop") which takes the FiniteMap as an
argument to the
			initialiser.

		(now in the loaded module)

		- de-reference FiniteMap StablePtr, and add a handler function and
string-identifier
			using addToFM, then create a newStablePtr to the modified FiniteMap and
call the
			dynamic imported main-loop fn with FiniteMap as argument.

		- main loop calls back to module at a later time - dependant on string
identifier.

when I run this with +RTS -B it successfully loads, links and calls back 3
or 4 times, then goes 'beep'
and dies - I think in the garbage collector thread itself, or as soon as the
GC finishes. Any info that
would shed light on what is happening would be useful.

	Regards,
	Keean Schupke.