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.