
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.
participants (1)
-
Keean