On 7/20/06, Evan Martin <[EMAIL PROTECTED]> wrote:
To elaborate, the code setting this up looks something like this: callback_fcn <- ... -- get a FunPtr using "wrapper" from the ffi free_fcn <- ... -- as above -- the callback data is just stuff that needs freeing callback_data <- newStablePtr (callback_fcn, free_fcn) register_callback callback_fcn callback_data free_fcn And my plan was: within the function free_fcn wraps, free callback_fcn, free the StablePtr, and then finally free free_fcn itself.
As Taral mentioned there's no need in creating different free_fcn's for each new callback. The following may be considered as a linker hack but I see no reason why it could not work:
freeCallback :: StablePtr (FunPtr a) -> IO () freeCallback sPtr = do fPtr <- deRefStablePtr sPtr freeStablePtr sPtr freeHaskellFunPtr fPtr foreign export ccall "_hs_some_really_private_symbol" freeCallback :: StablePtr (FunPtr a) -> IO () foreign import ccall "&_hs_some_really_private_symbol" free_fcn :: FunPtr (StablePtr (FunPtr a) -> IO ())
And then you can use it like this: ... callback_data <- newStablePtr callback_fcn register_callback callback_fcn callback_data free_fcn -- Tolik _______________________________________________ Haskell mailing list Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell