2011-06-20 7 views
2

FunPtrは、必要なときにいつでも新しい関数を作成してその解放を処理するのではなく、一度だけトップレベルの関数に作成することが望ましいと思われます。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) 

編集:1がfreeHaskellFunPtrがない場合は、「新しいものを作成するたびに」変異体(main = forever (mkSomeCallback f)は)事実リークメモリにないことを確認しました。

答えて

4

これは原則として安全であるべきです - GHC内部コードは、IO監視ハンドルキューなどのシングルトンを初期化するために同様のパターンを使用します。 mkSomeCallbackがいつ実行されるかは制御できません。NOINLINEを忘れないようにしてください。