AccelerateHS / AccelerateHS/accelerate

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

未关闭
#563 0 条评论 0 个 reaction 已指派 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 摘要。