私は、パイプ インターフェイスでのエンコーディング用に C ライブラリをラップしている最中ですが、いくつかの設計上の決定を行う必要があることに気付きました。
C ライブラリがセットアップされた後、エンコーダ コンテキストを保持します。これにより、いくつかのパラメーターをエンコードまたは変更できます (この最後の関数への Haskell インターフェースを呼び出しましょうtune :: Context -> Int -> IO ()
)。私の質問には2つの部分があります:
- エンコーディング部分は で簡単にラップできますが、
Pipe Foo Bar IO ()
も公開したいと思いtune
ます。エンコーディング コンテキストの同時使用はロックで保護する必要があるため、パイプ内の反復ごとにロックをtune
取得し、同じロックを取得して保護する必要があります。しかし今、ユーザーに隠しロックを強制しているように感じます。ここで間違ったツリーを吠えていますか? この種の状況は通常、パイプのエコシステムでどのように解決されますか? 私の場合、特定のコードが含まれるパイプは常に独自のスレッドで実行され、同時にチューニングが行われることを期待していますが、この観点をユーザーに強制したくありません。パイプエコシステムの他のパッケージは、ユーザーにどちらかを強制することはないようです。 - 使用されなくなったエンコーディング コンテキストは、適切に初期化解除する必要があります。パイプのエコシステムでは
IO
、パイプが破壊されたときにそのようなこと (この場合はいくつかのアクションを実行すること) が確実に処理されるようにするにはどうすればよいでしょうか?
具体的な例は、圧縮ライブラリをラップすることです。この場合、上記は次のようになります。
- 圧縮強度は調整可能です。パイプを設置すると、楽しそうに流れていきます。圧縮コーデック コンテキストへの同時アクセスをシリアル化する必要があると仮定すると、パイプの実行中に圧縮強度の設定を変更できるようにするにはどうすればよいでしょうか?
- 圧縮ライブラリは、セットアップ時に Haskell ヒープから大量のメモリを割り当てました。パイプが破棄されたときに、ライブラリ関数を呼び出してこれをクリーンアップする必要があります。
ありがとう…これはすべて明白かもしれませんが、私はパイプのエコシステムにまったく慣れていません。
編集:投稿後にこれを読んで、これが私が今までここで尋ねた中で最も漠然とした質問だと確信しています. うーん!ごめん ;-)