77
88using namespace Napi ;
99
10+ class TestWorkerWithUserDefRecv : public AsyncWorker {
11+ public:
12+ static void DoWork (const CallbackInfo& info) {
13+ Object recv = info[0 ].As <Object>();
14+ Function cb = info[1 ].As <Function>();
15+
16+ TestWorkerWithUserDefRecv* worker = new TestWorkerWithUserDefRecv (recv, cb);
17+ worker->Queue ();
18+ }
19+
20+ static void DoWorkWithAsyncRes (const CallbackInfo& info) {
21+ Object recv = info[0 ].As <Object>();
22+ Function cb = info[1 ].As <Function>();
23+ Object resource = info[2 ].As <Object>();
24+
25+ TestWorkerWithUserDefRecv* worker = nullptr ;
26+ if (resource == info.Env ().Null ()) {
27+ worker = new TestWorkerWithUserDefRecv (recv, cb, " TestResource" );
28+ } else {
29+ worker =
30+ new TestWorkerWithUserDefRecv (recv, cb, " TestResource" , resource);
31+ }
32+
33+ worker->Queue ();
34+ }
35+
36+ protected:
37+ void Execute () override {}
38+
39+ private:
40+ TestWorkerWithUserDefRecv (const Object& recv, const Function& cb)
41+ : AsyncWorker(recv, cb) {}
42+ TestWorkerWithUserDefRecv (const Object& recv,
43+ const Function& cb,
44+ const char * resource_name)
45+ : AsyncWorker(recv, cb, resource_name) {}
46+ TestWorkerWithUserDefRecv (const Object& recv,
47+ const Function& cb,
48+ const char * resource_name,
49+ const Object& resource)
50+ : AsyncWorker(recv, cb, resource_name, resource) {}
51+ };
52+
53+ // Using default std::allocator impl, but assuming user can define their own
54+ // alloc/dealloc methods
55+ class CustomAllocWorker : public AsyncWorker {
56+ public:
57+ CustomAllocWorker (Function& cb) : AsyncWorker(cb){};
58+ static void DoWork (const CallbackInfo& info) {
59+ Function cb = info[0 ].As <Function>();
60+ std::allocator<CustomAllocWorker> create_alloc;
61+ CustomAllocWorker* newWorker = create_alloc.allocate (1 );
62+ create_alloc.construct (newWorker, cb);
63+ newWorker->Queue ();
64+ }
65+
66+ protected:
67+ void Execute () override {}
68+ void Destroy () override {
69+ assert (this ->_secretVal == 24 );
70+ std::allocator<CustomAllocWorker> deallocer;
71+ deallocer.destroy (this );
72+ deallocer.deallocate (this , 1 );
73+ }
74+
75+ private:
76+ int _secretVal = 24 ;
77+ };
78+
1079class TestWorker : public AsyncWorker {
1180 public:
1281 static void DoWork (const CallbackInfo& info) {
@@ -15,7 +84,13 @@ class TestWorker : public AsyncWorker {
1584 Function cb = info[2 ].As <Function>();
1685 Value data = info[3 ];
1786
18- TestWorker* worker = new TestWorker (cb, " TestResource" , resource);
87+ TestWorker* worker = nullptr ;
88+ if (resource == info.Env ().Null ()) {
89+ worker = new TestWorker (cb, " TestResource" );
90+ } else {
91+ worker = new TestWorker (cb, " TestResource" , resource);
92+ }
93+
1994 worker->Receiver ().Set (" data" , data);
2095 worker->_succeed = succeed;
2196 worker->Queue ();
@@ -31,6 +106,8 @@ class TestWorker : public AsyncWorker {
31106 private:
32107 TestWorker (Function cb, const char * resource_name, const Object& resource)
33108 : AsyncWorker(cb, resource_name, resource) {}
109+ TestWorker (Function cb, const char * resource_name)
110+ : AsyncWorker(cb, resource_name) {}
34111 bool _succeed;
35112};
36113
@@ -72,12 +149,25 @@ class TestWorkerWithResult : public AsyncWorker {
72149class TestWorkerNoCallback : public AsyncWorker {
73150 public:
74151 static Value DoWork (const CallbackInfo& info) {
152+ bool succeed = info[0 ].As <Boolean>();
153+
154+ TestWorkerNoCallback* worker = new TestWorkerNoCallback (info.Env ());
155+ worker->_succeed = succeed;
156+ worker->Queue ();
157+ return worker->_deferred .Promise ();
158+ }
159+
160+ static Value DoWorkWithAsyncRes (const CallbackInfo& info) {
75161 napi_env env = info.Env ();
76162 bool succeed = info[0 ].As <Boolean>();
77163 Object resource = info[1 ].As <Object>();
78164
79- TestWorkerNoCallback* worker =
80- new TestWorkerNoCallback (env, " TestResource" , resource);
165+ TestWorkerNoCallback* worker = nullptr ;
166+ if (resource == info.Env ().Null ()) {
167+ worker = new TestWorkerNoCallback (env, " TestResource" );
168+ } else {
169+ worker = new TestWorkerNoCallback (env, " TestResource" , resource);
170+ }
81171 worker->_succeed = succeed;
82172 worker->Queue ();
83173 return worker->_deferred .Promise ();
@@ -91,6 +181,13 @@ class TestWorkerNoCallback : public AsyncWorker {
91181 }
92182
93183 private:
184+ TestWorkerNoCallback (Napi::Env env)
185+ : AsyncWorker(env), _deferred(Napi::Promise::Deferred::New(env)) {}
186+
187+ TestWorkerNoCallback (napi_env env, const char * resource_name)
188+ : AsyncWorker(env, resource_name),
189+ _deferred (Napi::Promise::Deferred::New(env)) {}
190+
94191 TestWorkerNoCallback (napi_env env,
95192 const char * resource_name,
96193 const Object& resource)
@@ -222,7 +319,12 @@ class CancelWorker : public AsyncWorker {
222319
223320Object InitAsyncWorker (Env env) {
224321 Object exports = Object::New (env);
322+ exports[" doWorkRecv" ] = Function::New (env, TestWorkerWithUserDefRecv::DoWork);
323+ exports[" doWithRecvAsyncRes" ] =
324+ Function::New (env, TestWorkerWithUserDefRecv::DoWorkWithAsyncRes);
225325 exports[" doWork" ] = Function::New (env, TestWorker::DoWork);
326+ exports[" doWorkAsyncResNoCallback" ] =
327+ Function::New (env, TestWorkerNoCallback::DoWorkWithAsyncRes);
226328 exports[" doWorkNoCallback" ] =
227329 Function::New (env, TestWorkerNoCallback::DoWork);
228330 exports[" doWorkWithResult" ] =
@@ -231,5 +333,7 @@ Object InitAsyncWorker(Env env) {
231333
232334 exports[" expectCancelToFail" ] =
233335 Function::New (env, FailCancelWorker::DoCancel);
336+ exports[" expectCustomAllocWorkerToDealloc" ] =
337+ Function::New (env, CustomAllocWorker::DoWork);
234338 return exports;
235339}
0 commit comments