2011-06-20 67 views
2

只需一次就创建一个顶级函数而不是创建一个新的函数(对同一个函数),并且处理它的释放处理似乎是可取的。Haskell FFI:顶级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它。

回答

4

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