Skip to content

Commit c5c353d

Browse files
committed
upgrade ObjectWrap example to multi-context support
1 parent b024ee9 commit c5c353d

File tree

4 files changed

+51
-17
lines changed

4 files changed

+51
-17
lines changed

6_object_wrap/node-addon-api/addon.js

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,42 @@
1-
var addon = require('bindings')('addon');
1+
const addon = require('bindings')('addon');
2+
const {Worker, isMainThread, workerData} = require('worker_threads');
3+
const os = require('os');
24

3-
var obj = new addon.MyObject(10);
4-
console.log( obj.plusOne() ); // 11
5-
console.log( obj.plusOne() ); // 12
6-
console.log( obj.plusOne() ); // 13
5+
if (isMainThread) {
6+
(async function main() {
7+
const threads = new Promise(resolve => {
8+
const size = os.cpus().length * 2;
9+
let wait = size;
710

8-
console.log( obj.multiply().value() ); // 13
9-
console.log( obj.multiply(10).value() ); // 130
11+
for (let i = 0; i < size; i++) {
12+
const worker = new Worker(__filename, {workerData: i});
1013

11-
var newobj = obj.multiply(-1);
12-
console.log( newobj.value() ); // -13
13-
console.log( obj === newobj ); // false
14+
worker.on('exit', () => {
15+
wait--;
16+
if (wait === 0) {
17+
resolve();
18+
}
19+
});
20+
}
21+
});
22+
23+
work('main');
24+
await threads;
25+
})();
26+
} else {
27+
work(workerData);
28+
}
29+
30+
function work(id) {
31+
const obj = new addon.MyObject(10);
32+
for (let i = 0; i < 10; i++) {
33+
console.log(id, obj.plusOne());
34+
}
35+
36+
console.log(id, obj.multiply().value());
37+
console.log(id, obj.multiply(10).value());
38+
39+
const newobj = obj.multiply(-1);
40+
console.log(id, newobj.value());
41+
console.log(id, obj === newobj);
42+
}

6_object_wrap/node-addon-api/myobject.cc

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
#include "myobject.h"
22

3-
Napi::FunctionReference MyObject::constructor;
3+
class AddonData {
4+
public:
5+
AddonData(Napi::Function func) {
6+
MyObjectConstructor = Napi::Persistent(func);
7+
MyObjectConstructor.SuppressDestruct();
8+
}
9+
10+
Napi::FunctionReference MyObjectConstructor;
11+
};
412

513
Napi::Object MyObject::Init(Napi::Env env, Napi::Object exports) {
614
Napi::HandleScope scope(env);
@@ -12,8 +20,7 @@ Napi::Object MyObject::Init(Napi::Env env, Napi::Object exports) {
1220
InstanceMethod("value", &MyObject::GetValue),
1321
InstanceMethod("multiply", &MyObject::Multiply)});
1422

15-
constructor = Napi::Persistent(func);
16-
constructor.SuppressDestruct();
23+
env.SetInstanceData(new AddonData(func));
1724

1825
exports.Set("MyObject", func);
1926
return exports;
@@ -55,7 +62,7 @@ Napi::Value MyObject::Multiply(const Napi::CallbackInfo& info) {
5562
multiple = info[0].As<Napi::Number>();
5663
}
5764

58-
Napi::Object obj = constructor.New(
65+
Napi::Object obj = info.Env().GetInstanceData<AddonData>()->MyObjectConstructor.New(
5966
{Napi::Number::New(info.Env(), this->value_ * multiple.DoubleValue())});
6067

6168
return obj;

6_object_wrap/node-addon-api/myobject.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ class MyObject : public Napi::ObjectWrap<MyObject> {
99
MyObject(const Napi::CallbackInfo& info);
1010

1111
private:
12-
static Napi::FunctionReference constructor;
13-
1412
Napi::Value GetValue(const Napi::CallbackInfo& info);
1513
Napi::Value PlusOne(const Napi::CallbackInfo& info);
1614
Napi::Value Multiply(const Napi::CallbackInfo& info);

6_object_wrap/node-addon-api/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@
77
"gypfile": true,
88
"dependencies": {
99
"bindings": "~1.2.1",
10-
"node-addon-api": "^1.0.0"
10+
"node-addon-api": "^3.0.0"
1111
}
1212
}

0 commit comments

Comments
 (0)