Hello,

  I'm working on interfacing a c library that has the
notion of callbacks.

I have a C function:

f_setCallback( void (funptr*) () );

I would like to allow a haskell developer to have an
interface like the following:

callback :: IO ()
callback = putStr "Called!\n"

main :: IO ()
main = do
  setCallback callback
  -- etc.

Is this possible via. ffi?  If so, how would I do it
code wise?


foreign import ccall "wrapper" mkCallback :: IO () -> FunPtr (IO ())
foreign import ccall "f_setCallback" f_setCallback :: FunPtr (IO ()) -> IO ()


setCallback cb = mkCallback cb >>= f_setCallback

That solution has one slight disadvantage, though:
mkCallback dynamically creates an "adjustor thunk", which is a short piece of machine code that translates from the C calling convention to Haskell. This thunk should be freed using freeHaskellFunPtr when it is no longer needed (i.e. when a different callback is installed). So setCallback should really check if there is already a _Haskell_ callback installed, and if so, free it using freeHaskellFunPtr. Otherwise, you'd have a small memory leak.


Cheers,

Wolfgang

_______________________________________________
FFI mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/ffi

Reply via email to