Skip to content

Commit 25a9e86

Browse files
reillyeonchromium-wpt-export-bot
authored andcommitted
webnn: Discard data when canceling a BYOB read
If the buffer is detached the read is cancelled however the data in the shared Mojo data pipe used for reads still need to be handled or else a later read will get this data instead. Fixed: 511826204 Change-Id: I82f10690d741c8b9b34419c3ac3d0e85511fd594 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7858250 Reviewed-by: Hu, Ningxin <ningxin.hu@intel.com> Commit-Queue: Reilly Grant <reillyg@chromium.org> Auto-Submit: Reilly Grant <reillyg@chromium.org> Cr-Commit-Position: refs/heads/main@{#1633293}
1 parent 6d2fe0c commit 25a9e86

1 file changed

Lines changed: 34 additions & 0 deletions

File tree

webnn/conformance_tests/byob_readtensor.https.any.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,3 +195,37 @@ promise_test(async (t) => {
195195

196196
await checks;
197197
}, `readTensor() rejects when the MLTensor is destroyed`);
198+
199+
promise_test(async (t) => {
200+
const tensorA = await mlContext.createTensor({
201+
dataType: 'int32',
202+
shape: [128, 1024],
203+
readable: true,
204+
writable: true,
205+
});
206+
const tensorB = await mlContext.createTensor({
207+
dataType: 'int32',
208+
shape: [128, 1024],
209+
readable: true,
210+
writable: true,
211+
});
212+
const length = tensorA.shape.reduce((a, b) => a * b);
213+
const contentsA = new Int32Array(length).fill(1);
214+
const contentsB = new Int32Array(length).fill(2);
215+
216+
mlContext.writeTensor(tensorA, contentsA);
217+
mlContext.writeTensor(tensorB, contentsB);
218+
219+
const bufferA = new ArrayBuffer(contentsA.byteLength);
220+
const readPromise = mlContext.readTensor(tensorA, bufferA);
221+
bufferA.transfer();
222+
223+
await promise_rejects_js(t, TypeError, readPromise);
224+
225+
const bufferB = new ArrayBuffer(contentsB.byteLength);
226+
await mlContext.readTensor(tensorB, bufferB);
227+
assert_array_equals(new Int32Array(bufferB), contentsB);
228+
229+
tensorA.destroy();
230+
tensorB.destroy();
231+
}, `Subsequent readTensor() after reading into a detached buffer gets correct data`);

0 commit comments

Comments
 (0)