gpt4 book ai didi

haskell FFI : Top-level FunPtr to a top-level function?

转载 作者:行者123 更新时间:2023-12-02 13:37:19 28 4
gpt4 key购买 nike

似乎最好只为顶级函数创建一次 FunPtr,而不是在需要时创建一个新的函数(同一函数)并处理其释放。

除了 foreign import ccall "wrapper" 之外,我是否忽略了获取 FunPtr 的其他方法?如果没有,我的解决方法将如下面的代码所示。这样安全吗?

type SomeCallback = CInt -> IO ()

foreign import ccall "wrapper" mkSomeCallback :: SomeCallback -> IO (FunPtr SomeCallback)

f :: SomeCallback
f i = putStrLn ("It is: "++show i)

{-# NOINLINE f_FunPtr #-}
f_FunPtr :: FunPtr SomeCallback
f_FunPtr = unsafePerformIO (mkSomeCallback f)

编辑:验证“每次创建一个新的”变体(main =forever (mkSomeCallback f))实际上会泄漏内存(如果不这样做)freeHaskellFunPtr 它。

最佳答案

原则上,这应该是安全的 - GHC 内部代码使用类似的模式来初始化单例,例如 IO 监视句柄队列。请记住,您无法控制 mkSomeCallback 何时运行,并且不要忘记NOINLINE

关于 haskell FFI : Top-level FunPtr to a top-level function?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6407095/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com