andywer / andywer/threads.js

What is the correct way to ensure zero copy of an ArrayBuffer and the ability to transfer back to the main thread (without reassignment)

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

説明

I have a worker function:

```
mutate (what: ArrayBuffer): TransferDescriptor {
const inView = new Uint8Array(what);
inView[0] = 88;
return Transfer(what);
},
```

When I `Transfer` an `ArrayBuffer` into this method, the original `ArrayBuffer` becomes detached.

```
const what = await workerManager.call(
async w => {
const o = await w.mutate(Transfer(ab));
return o;
}
);
```

```
ab => ArrayBuffer { (detached), byteLength: 0 }
what => ArrayBuffer { [Uint8Contents]: <58 62 63>, byteLength: 3 }
```

Note that the `call` method just does this:

```
public async call(
f: (worker: ModuleThread) => Promise,
): Promise {
if (!this.pool) {
throw new workersErrors.EncryptedFSWorkerNotRunningError();
}
return await this.pool.queue(f);
}
```

I notice I have to use the returned array buffer. The `ab` is no longer usable.

I thought I would be able to share a buffer with a thread, make that thread make mutations, and then share that buffer back, but the above seems to mean that I have to use a new assignment, and discard the old assignment.

Furthermore I actually want to use Node buffers. But when I use node buffers with the internal array buffer, the internal array buffer gets detached even under the same usage. This is quite strange behaviour.

This is a follow up from https://github.com/andywer/threads.js/issues/348

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

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

評価

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

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

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