-
-
Notifications
You must be signed in to change notification settings - Fork 33.6k
Closed
Labels
bufferIssues and PRs related to the buffer subsystem.Issues and PRs related to the buffer subsystem.
Description
After transferring a Buffer instance to a different thread, it becomes impossible to construct new Buffers in the current thread.
- Version: v12.16.2
- Platform: win10 x64
- Subsystem: buffer, worker_threads
What steps will reproduce the bug?
var worker_threads = require('worker_threads');
if (worker_threads.isMainThread) {
var worker = new worker_threads.Worker(__filename);
worker.on('message', function(msg) {
console.log(msg);
});
} else {
try {
sendBuf(Buffer.from('hello world'));
sendBuf(Buffer.from('hello world'));
} catch (ex) {
console.error(ex);
}
}
function sendBuf(buf) {
worker_threads.parentPort.postMessage({
buf: buf
}, [ buf.buffer ]);
}What is the expected behavior?
It should not crash node
What do you see instead?
{
buf: Uint8Array(11) [
104, 101, 108, 108,
111, 32, 119, 111,
114, 108, 100
]
}
TypeError: Cannot perform Construct on a neutered ArrayBuffer
at new Uint8Array (<anonymous>)
at new FastBuffer (internal/buffer.js:945:1)
at fromStringFast (buffer.js:427:11)
at fromString (buffer.js:452:10)
at Function.from (buffer.js:302:12)
at Object.<anonymous> (/worker-test.js:14:18)
at Module._compile (internal/modules/cjs/loader.js:1156:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1176:10)
at Module.load (internal/modules/cjs/loader.js:1000:32)
at Function.Module._load (internal/modules/cjs/loader.js:899:14)
It looks like after the first Buffer is transferred out, the allocPool contains a now-neutered ArrayBuffer.
If I call createPool() before
Line 427 in 3443e3a
| let b = new FastBuffer(allocPool, poolOffset, length); |
then the operation succeeds.
devnexen
Metadata
Metadata
Assignees
Labels
bufferIssues and PRs related to the buffer subsystem.Issues and PRs related to the buffer subsystem.