@@ -129,6 +129,19 @@ static void call_js(napi_env env, napi_value cb, void* hint, void* data) {
129
129
}
130
130
}
131
131
132
+ static napi_ref alt_ref ;
133
+ // Getting the data into JS with the alternative referece
134
+ static void call_ref (napi_env env , napi_value _ , void * hint , void * data ) {
135
+ if (!(env == NULL || alt_ref == NULL )) {
136
+ napi_value fn , argv , undefined ;
137
+ NAPI_CALL_RETURN_VOID (env , napi_get_reference_value (env , alt_ref , & fn ));
138
+ NAPI_CALL_RETURN_VOID (env , napi_create_int32 (env , * (int * )data , & argv ));
139
+ NAPI_CALL_RETURN_VOID (env , napi_get_undefined (env , & undefined ));
140
+ NAPI_CALL_RETURN_VOID (env , napi_call_function (env , undefined , fn , 1 , & argv ,
141
+ NULL ));
142
+ }
143
+ }
144
+
132
145
// Cleanup
133
146
static napi_value StopThread (napi_env env , napi_callback_info info ) {
134
147
size_t argc = 2 ;
@@ -168,20 +181,31 @@ static void join_the_threads(napi_env env, void *data, void *hint) {
168
181
napi_call_function (env , undefined , js_cb , 0 , NULL , NULL ));
169
182
NAPI_CALL_RETURN_VOID (env , napi_delete_reference (env ,
170
183
the_hint -> js_finalize_cb ));
184
+ if (alt_ref != NULL ) {
185
+ NAPI_CALL_RETURN_VOID (env , napi_delete_reference (env , alt_ref ));
186
+ alt_ref = NULL ;
187
+ }
171
188
}
172
189
173
190
static napi_value StartThreadInternal (napi_env env ,
174
191
napi_callback_info info ,
175
192
napi_threadsafe_function_call_js cb ,
176
- bool block_on_full ) {
193
+ bool block_on_full ,
194
+ bool alt_ref_js_cb ) {
195
+
177
196
size_t argc = 4 ;
178
197
napi_value argv [4 ];
179
198
199
+ NAPI_CALL (env , napi_get_cb_info (env , info , & argc , argv , NULL , NULL ));
200
+ if (alt_ref_js_cb ) {
201
+ NAPI_CALL (env , napi_create_reference (env , argv [0 ], 1 , & alt_ref ));
202
+ argv [0 ] = NULL ;
203
+ }
204
+
180
205
ts_info .block_on_full =
181
206
(block_on_full ? napi_tsfn_blocking : napi_tsfn_nonblocking );
182
207
183
208
NAPI_ASSERT (env , (ts_fn == NULL ), "Existing thread-safe function" );
184
- NAPI_CALL (env , napi_get_cb_info (env , info , & argc , argv , NULL , NULL ));
185
209
napi_value async_name ;
186
210
NAPI_CALL (env , napi_create_string_utf8 (env , "N-API Thread-safe Function Test" ,
187
211
NAPI_AUTO_LENGTH , & async_name ));
@@ -223,16 +247,24 @@ static napi_value Release(napi_env env, napi_callback_info info) {
223
247
224
248
// Startup
225
249
static napi_value StartThread (napi_env env , napi_callback_info info ) {
226
- return StartThreadInternal (env , info , call_js , true);
250
+ return StartThreadInternal (env , info , call_js ,
251
+ /** block_on_full */ true, /** alt_ref_js_cb */ false);
227
252
}
228
253
229
254
static napi_value StartThreadNonblocking (napi_env env ,
230
255
napi_callback_info info ) {
231
- return StartThreadInternal (env , info , call_js , false);
256
+ return StartThreadInternal (env , info , call_js ,
257
+ /** block_on_full */ false, /** alt_ref_js_cb */ false);
232
258
}
233
259
234
260
static napi_value StartThreadNoNative (napi_env env , napi_callback_info info ) {
235
- return StartThreadInternal (env , info , NULL , true);
261
+ return StartThreadInternal (env , info , NULL ,
262
+ /** block_on_full */ true, /** alt_ref_js_cb */ false);
263
+ }
264
+
265
+ static napi_value StartThreadNoJsFunc (napi_env env , napi_callback_info info ) {
266
+ return StartThreadInternal (env , info , call_ref ,
267
+ /** block_on_full */ true, /** alt_ref_js_cb */ true);
236
268
}
237
269
238
270
// Module init
@@ -269,6 +301,7 @@ static napi_value Init(napi_env env, napi_value exports) {
269
301
DECLARE_NAPI_PROPERTY ("StartThread" , StartThread ),
270
302
DECLARE_NAPI_PROPERTY ("StartThreadNoNative" , StartThreadNoNative ),
271
303
DECLARE_NAPI_PROPERTY ("StartThreadNonblocking" , StartThreadNonblocking ),
304
+ DECLARE_NAPI_PROPERTY ("StartThreadNoJsFunc" , StartThreadNoJsFunc ),
272
305
DECLARE_NAPI_PROPERTY ("StopThread" , StopThread ),
273
306
DECLARE_NAPI_PROPERTY ("Unref" , Unref ),
274
307
DECLARE_NAPI_PROPERTY ("Release" , Release ),
0 commit comments