From 1f1a373df0121a9e4a2887f69862169b2f4ed2fd Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Tue, 1 Jan 2019 21:42:43 +0100 Subject: worker: use engine-provided deleter for `SharedArrayBuffer`s Store the full information we have on a given `SharedArrayBuffer`, and use the deleter provided by the JS engine to free the memory when that is needed. This fixes memory lifetime management for WASM buffers that are passed through a `MessageChannel` (e.g. between threads). PR-URL: https://github.com/nodejs/node/pull/25307 Reviewed-By: Gus Caplan Reviewed-By: James M Snell Reviewed-By: Tiancheng "Timothy" Gu --- src/sharedarraybuffer_metadata.cc | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) (limited to 'src/sharedarraybuffer_metadata.cc') diff --git a/src/sharedarraybuffer_metadata.cc b/src/sharedarraybuffer_metadata.cc index 3e760bc50b..671ad6d682 100644 --- a/src/sharedarraybuffer_metadata.cc +++ b/src/sharedarraybuffer_metadata.cc @@ -89,8 +89,7 @@ SharedArrayBufferMetadata::ForSharedArrayBuffer( } SharedArrayBuffer::Contents contents = source->Externalize(); - SharedArrayBufferMetadataReference r(new SharedArrayBufferMetadata( - contents.Data(), contents.ByteLength())); + SharedArrayBufferMetadataReference r(new SharedArrayBufferMetadata(contents)); if (r->AssignToSharedArrayBuffer(env, context, source).IsNothing()) return nullptr; return r; @@ -111,17 +110,22 @@ Maybe SharedArrayBufferMetadata::AssignToSharedArrayBuffer( obj); } -SharedArrayBufferMetadata::SharedArrayBufferMetadata(void* data, size_t size) - : data(data), size(size) { } +SharedArrayBufferMetadata::SharedArrayBufferMetadata( + const SharedArrayBuffer::Contents& contents) + : contents_(contents) { } SharedArrayBufferMetadata::~SharedArrayBufferMetadata() { - free(data); + contents_.Deleter()(contents_.Data(), + contents_.ByteLength(), + contents_.DeleterData()); } MaybeLocal SharedArrayBufferMetadata::GetSharedArrayBuffer( Environment* env, Local context) { Local obj = - SharedArrayBuffer::New(env->isolate(), data, size); + SharedArrayBuffer::New(env->isolate(), + contents_.Data(), + contents_.ByteLength()); if (AssignToSharedArrayBuffer(env, context, obj).IsNothing()) return MaybeLocal(); -- cgit v1.2.3