AccelerateHS / AccelerateHS/accelerate

[BUG] Race between `clean` and `remoteFinalizer` for unmanaged buffers

オープン
#563 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る
主要言語
Haskell
スター
1k
フォーク
135
PR マージ指標
30日以内にマージされた PR はありません

説明

**Description**
In `Data.Array.Accelerate.Array.Remote.Table`, there is a function called `insertUnmanaged` which I believe is necessary for handing off pre-existing CUDA buffers to Accelerate. There is an assumed invariant here, namely that the `remoteFinalizer` attached to a `Weak` reference is run before `deRefWeak` can return `Nothing` in `clean`. This is not actually always true, and `deRefWeak` can return `Nothing` before `remoteFinalizer` runs and thus `clean` will see a buffer in the table and it will be "unreferenced" and so it will invoke `freeStable` on it, thus you could accidentally free a buffer provided by `insertUnmanaged`.

**Steps to reproduce**
I have not seen this in the wild but this appears real from reading `Data.Array.Accelerate.Array.Remote.Table`. I have confirmed that this order-of-operations of `deRefWeak` and the finalizer logic are inconsistent in the way described above, with an example Haskell program.

コントリビューションガイド

このリポジトリのコントリビューションガイドは索引されていません

評価

この issue はまだ評価されていません。

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。