summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorAnna Henningsen <anna@addaleax.net>2019-11-13 19:19:54 +0000
committerAnna Henningsen <anna@addaleax.net>2019-11-19 14:01:32 +0100
commit6cb8e4b12cd16ae8ed126f98458efb78312cabf6 (patch)
treee37ef2d4f2104f6f51479ea78c63e6f890cea7c0 /test
parent1317ac65b4f001588b86002aa22431719683beb4 (diff)
downloadandroid-node-v8-6cb8e4b12cd16ae8ed126f98458efb78312cabf6.tar.gz
android-node-v8-6cb8e4b12cd16ae8ed126f98458efb78312cabf6.tar.bz2
android-node-v8-6cb8e4b12cd16ae8ed126f98458efb78312cabf6.zip
src: mark ArrayBuffers with free callbacks as untransferable
More precisely, make them untransferable if they were created through *our* APIs, because those do not follow the improved free callback mechanism that V8 uses now. All other ArrayBuffers can be transferred between threads now, the assumption being that they were created in a clean way that follows the V8 API on this. This addresses a TODO comment. Refs: https://github.com/nodejs/node/pull/30339#issuecomment-552225353 PR-URL: https://github.com/nodejs/node/pull/30475 Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: David Carlier <devnexen@gmail.com>
Diffstat (limited to 'test')
-rw-r--r--test/addons/worker-buffer-callback/binding.cc29
-rw-r--r--test/addons/worker-buffer-callback/binding.gyp9
-rw-r--r--test/addons/worker-buffer-callback/test.js15
3 files changed, 53 insertions, 0 deletions
diff --git a/test/addons/worker-buffer-callback/binding.cc b/test/addons/worker-buffer-callback/binding.cc
new file mode 100644
index 0000000000..a40876ebb5
--- /dev/null
+++ b/test/addons/worker-buffer-callback/binding.cc
@@ -0,0 +1,29 @@
+#include <node.h>
+#include <node_buffer.h>
+#include <v8.h>
+
+using v8::Context;
+using v8::Isolate;
+using v8::Local;
+using v8::Object;
+using v8::Value;
+
+char data[] = "hello";
+
+void Initialize(Local<Object> exports,
+ Local<Value> module,
+ Local<Context> context) {
+ Isolate* isolate = context->GetIsolate();
+ exports->Set(context,
+ v8::String::NewFromUtf8(
+ isolate, "buffer", v8::NewStringType::kNormal)
+ .ToLocalChecked(),
+ node::Buffer::New(
+ isolate,
+ data,
+ sizeof(data),
+ [](char* data, void* hint) {},
+ nullptr).ToLocalChecked()).Check();
+}
+
+NODE_MODULE_CONTEXT_AWARE(NODE_GYP_MODULE_NAME, Initialize)
diff --git a/test/addons/worker-buffer-callback/binding.gyp b/test/addons/worker-buffer-callback/binding.gyp
new file mode 100644
index 0000000000..55fbe7050f
--- /dev/null
+++ b/test/addons/worker-buffer-callback/binding.gyp
@@ -0,0 +1,9 @@
+{
+ 'targets': [
+ {
+ 'target_name': 'binding',
+ 'sources': [ 'binding.cc' ],
+ 'includes': ['../common.gypi'],
+ }
+ ]
+}
diff --git a/test/addons/worker-buffer-callback/test.js b/test/addons/worker-buffer-callback/test.js
new file mode 100644
index 0000000000..b04984f157
--- /dev/null
+++ b/test/addons/worker-buffer-callback/test.js
@@ -0,0 +1,15 @@
+'use strict';
+const common = require('../../common');
+const assert = require('assert');
+const { MessageChannel } = require('worker_threads');
+const { buffer } = require(`./build/${common.buildType}/binding`);
+
+// Test that buffers allocated with a free callback through our APIs are not
+// transfered.
+
+const { port1 } = new MessageChannel();
+const origByteLength = buffer.byteLength;
+port1.postMessage(buffer, [buffer.buffer]);
+
+assert.strictEqual(buffer.byteLength, origByteLength);
+assert.notStrictEqual(buffer.byteLength, 0);