@@ -258,11 +258,11 @@ static void release_object(void *data, Rboolean jump) {
258
258
}
259
259
260
260
static void raio_invoke_cb (void * arg ) {
261
- SEXP call , data = (SEXP ) arg ;
262
- PROTECT (call = Rf_lcons (data , R_NilValue ));
263
- (void ) R_UnwindProtect (eval_safe , call , release_object , data , NULL );
261
+ SEXP call , env = (SEXP ) arg ;
262
+ PROTECT (call = Rf_lcons (CADR ( ATTRIB ( env )) , R_NilValue ));
263
+ (void ) R_UnwindProtect (eval_safe , call , release_object , env , NULL );
264
264
UNPROTECT (1 );
265
- R_ReleaseObject (data );
265
+ R_ReleaseObject (env );
266
266
}
267
267
268
268
static void raio_complete_cb (void * arg ) {
@@ -280,7 +280,8 @@ static void raio_complete_cb(void *arg) {
280
280
raio -> result = res - !res ;
281
281
#endif
282
282
283
- later2 (raio_invoke_cb , raio -> cb , 0 );
283
+ if (CADR (ATTRIB (raio -> cb )) != R_NilValue )
284
+ later2 (raio_invoke_cb , raio -> cb , 0 );
284
285
285
286
}
286
287
@@ -302,7 +303,8 @@ static void request_complete_cb(void *arg) {
302
303
nng_cv_wake (cv );
303
304
nng_mtx_unlock (mtx );
304
305
305
- later2 (raio_invoke_cb , raio -> cb , 0 );
306
+ if (CADR (ATTRIB (raio -> cb )) != R_NilValue )
307
+ later2 (raio_invoke_cb , raio -> cb , 0 );
306
308
307
309
}
308
310
@@ -1268,12 +1270,11 @@ SEXP rnng_ncurl_session_close(SEXP session) {
1268
1270
1269
1271
SEXP rnng_request_impl (const SEXP con , const SEXP data , const SEXP sendmode ,
1270
1272
const SEXP recvmode , const SEXP timeout , const SEXP clo ,
1271
- nano_cv * ncv , const SEXP cb ) {
1273
+ nano_cv * ncv , const int promises ) {
1272
1274
1273
1275
const nng_duration dur = timeout == R_NilValue ? NNG_DURATION_DEFAULT : (nng_duration ) Rf_asInteger (timeout );
1274
1276
const int mod = nano_matcharg (recvmode );
1275
1277
const int signal = ncv != NULL ;
1276
- const int promises = cb != NULL ;
1277
1278
nng_ctx * ctx = (nng_ctx * ) R_ExternalPtrAddr (con );
1278
1279
SEXP aio , env , fun ;
1279
1280
nano_buf buf ;
@@ -1309,12 +1310,14 @@ SEXP rnng_request_impl(const SEXP con, const SEXP data, const SEXP sendmode,
1309
1310
nng_ctx_send (* ctx , saio -> aio );
1310
1311
1311
1312
raio = R_Calloc (1 , nano_aio );
1313
+ PROTECT (env = Rf_allocSExp (ENVSXP ));
1312
1314
raio -> type = RECVAIO ;
1313
1315
raio -> mode = mod ;
1314
1316
raio -> next = saio ;
1315
- if (promises )
1316
- R_PreserveObject (cb );
1317
- raio -> cb = cb ;
1317
+ if (promises ) {
1318
+ R_PreserveObject (env );
1319
+ raio -> cb = env ;
1320
+ }
1318
1321
1319
1322
if ((xc = nng_aio_alloc (& raio -> aio ,
1320
1323
promises ?
@@ -1330,7 +1333,6 @@ SEXP rnng_request_impl(const SEXP con, const SEXP data, const SEXP sendmode,
1330
1333
PROTECT (aio = R_MakeExternalPtr (raio , nano_AioSymbol , R_NilValue ));
1331
1334
R_RegisterCFinalizerEx (aio , request_finalizer , TRUE);
1332
1335
1333
- PROTECT (env = Rf_allocSExp (ENVSXP ));
1334
1336
NANO_CLASS (env , "recvAio" );
1335
1337
Rf_defineVar (nano_AioSymbol , aio , env );
1336
1338
@@ -1344,6 +1346,7 @@ SEXP rnng_request_impl(const SEXP con, const SEXP data, const SEXP sendmode,
1344
1346
return env ;
1345
1347
1346
1348
exitlevel2 :
1349
+ UNPROTECT (1 );
1347
1350
R_Free (raio );
1348
1351
nng_aio_free (saio -> aio );
1349
1352
exitlevel1 :
@@ -1358,7 +1361,7 @@ SEXP rnng_request(SEXP con, SEXP data, SEXP sendmode, SEXP recvmode, SEXP timeou
1358
1361
if (R_ExternalPtrTag (con ) != nano_ContextSymbol )
1359
1362
Rf_error ("'con' is not a valid Context" );
1360
1363
1361
- return rnng_request_impl (con , data , sendmode , recvmode , timeout , clo , NULL , NULL );
1364
+ return rnng_request_impl (con , data , sendmode , recvmode , timeout , clo , NULL , 0 );
1362
1365
1363
1366
}
1364
1367
@@ -1370,18 +1373,18 @@ SEXP rnng_request_signal(SEXP con, SEXP data, SEXP cvar, SEXP sendmode, SEXP rec
1370
1373
Rf_error ("'cv' is not a valid Condition Variable" );
1371
1374
nano_cv * ncv = (nano_cv * ) R_ExternalPtrAddr (cvar );
1372
1375
1373
- return rnng_request_impl (con , data , sendmode , recvmode , timeout , clo , ncv , NULL );
1376
+ return rnng_request_impl (con , data , sendmode , recvmode , timeout , clo , ncv , 0 );
1374
1377
1375
1378
}
1376
1379
1377
- SEXP rnng_request_promise (SEXP con , SEXP data , SEXP cvar , SEXP sendmode , SEXP recvmode , SEXP timeout , SEXP clo , SEXP cb ) {
1380
+ SEXP rnng_request_promise (SEXP con , SEXP data , SEXP cvar , SEXP sendmode , SEXP recvmode , SEXP timeout , SEXP clo ) {
1378
1381
1379
1382
if (R_ExternalPtrTag (con ) != nano_ContextSymbol )
1380
1383
Rf_error ("'con' is not a valid Context" );
1381
1384
1382
1385
nano_cv * ncv = R_ExternalPtrTag (cvar ) == nano_CvSymbol ? (nano_cv * ) R_ExternalPtrAddr (cvar ) : NULL ;
1383
1386
1384
- return rnng_request_impl (con , data , sendmode , recvmode , timeout , clo , ncv , cb );
1387
+ return rnng_request_impl (con , data , sendmode , recvmode , timeout , clo , ncv , 1 );
1385
1388
1386
1389
}
1387
1390
0 commit comments