@@ -129,6 +129,19 @@ static void call_js(napi_env env, napi_value cb, void* hint, void* data) {
129129 }
130130}
131131
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+
132145// Cleanup
133146static napi_value StopThread (napi_env env , napi_callback_info info ) {
134147 size_t argc = 2 ;
@@ -168,20 +181,31 @@ static void join_the_threads(napi_env env, void *data, void *hint) {
168181 napi_call_function (env , undefined , js_cb , 0 , NULL , NULL ));
169182 NAPI_CALL_RETURN_VOID (env , napi_delete_reference (env ,
170183 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+ }
171188}
172189
173190static napi_value StartThreadInternal (napi_env env ,
174191 napi_callback_info info ,
175192 napi_threadsafe_function_call_js cb ,
176- bool block_on_full ) {
193+ bool block_on_full ,
194+ bool alt_ref_js_cb ) {
195+
177196 size_t argc = 4 ;
178197 napi_value argv [4 ];
179198
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+
180205 ts_info .block_on_full =
181206 (block_on_full ? napi_tsfn_blocking : napi_tsfn_nonblocking );
182207
183208 NAPI_ASSERT (env , (ts_fn == NULL ), "Existing thread-safe function" );
184- NAPI_CALL (env , napi_get_cb_info (env , info , & argc , argv , NULL , NULL ));
185209 napi_value async_name ;
186210 NAPI_CALL (env , napi_create_string_utf8 (env , "N-API Thread-safe Function Test" ,
187211 NAPI_AUTO_LENGTH , & async_name ));
@@ -223,16 +247,24 @@ static napi_value Release(napi_env env, napi_callback_info info) {
223247
224248// Startup
225249static 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);
227252}
228253
229254static napi_value StartThreadNonblocking (napi_env env ,
230255 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);
232258}
233259
234260static 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);
236268}
237269
238270// Module init
@@ -269,6 +301,7 @@ static napi_value Init(napi_env env, napi_value exports) {
269301 DECLARE_NAPI_PROPERTY ("StartThread" , StartThread ),
270302 DECLARE_NAPI_PROPERTY ("StartThreadNoNative" , StartThreadNoNative ),
271303 DECLARE_NAPI_PROPERTY ("StartThreadNonblocking" , StartThreadNonblocking ),
304+ DECLARE_NAPI_PROPERTY ("StartThreadNoJsFunc" , StartThreadNoJsFunc ),
272305 DECLARE_NAPI_PROPERTY ("StopThread" , StopThread ),
273306 DECLARE_NAPI_PROPERTY ("Unref" , Unref ),
274307 DECLARE_NAPI_PROPERTY ("Release" , Release ),
0 commit comments