need help with ffi function pointers

Wolfgang Thaller wolfgang.thaller at gmx.net
Sun Mar 2 05:24:07 EST 2003


> 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




More information about the FFI mailing list