@@ -258,11 +258,11 @@ static void release_object(void *data, Rboolean jump) {
258258}
259259
260260static 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 );
264264 UNPROTECT (1 );
265- R_ReleaseObject (data );
265+ R_ReleaseObject (env );
266266}
267267
268268static void raio_complete_cb (void * arg ) {
@@ -280,7 +280,8 @@ static void raio_complete_cb(void *arg) {
280280 raio -> result = res - !res ;
281281#endif
282282
283- later2 (raio_invoke_cb , raio -> cb , 0 );
283+ if (CADR (ATTRIB (raio -> cb )) != R_NilValue )
284+ later2 (raio_invoke_cb , raio -> cb , 0 );
284285
285286}
286287
@@ -302,7 +303,8 @@ static void request_complete_cb(void *arg) {
302303 nng_cv_wake (cv );
303304 nng_mtx_unlock (mtx );
304305
305- later2 (raio_invoke_cb , raio -> cb , 0 );
306+ if (CADR (ATTRIB (raio -> cb )) != R_NilValue )
307+ later2 (raio_invoke_cb , raio -> cb , 0 );
306308
307309}
308310
@@ -1268,12 +1270,11 @@ SEXP rnng_ncurl_session_close(SEXP session) {
12681270
12691271SEXP rnng_request_impl (const SEXP con , const SEXP data , const SEXP sendmode ,
12701272 const SEXP recvmode , const SEXP timeout , const SEXP clo ,
1271- nano_cv * ncv , const SEXP cb ) {
1273+ nano_cv * ncv , const int promises ) {
12721274
12731275 const nng_duration dur = timeout == R_NilValue ? NNG_DURATION_DEFAULT : (nng_duration ) Rf_asInteger (timeout );
12741276 const int mod = nano_matcharg (recvmode );
12751277 const int signal = ncv != NULL ;
1276- const int promises = cb != NULL ;
12771278 nng_ctx * ctx = (nng_ctx * ) R_ExternalPtrAddr (con );
12781279 SEXP aio , env , fun ;
12791280 nano_buf buf ;
@@ -1309,12 +1310,14 @@ SEXP rnng_request_impl(const SEXP con, const SEXP data, const SEXP sendmode,
13091310 nng_ctx_send (* ctx , saio -> aio );
13101311
13111312 raio = R_Calloc (1 , nano_aio );
1313+ PROTECT (env = Rf_allocSExp (ENVSXP ));
13121314 raio -> type = RECVAIO ;
13131315 raio -> mode = mod ;
13141316 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+ }
13181321
13191322 if ((xc = nng_aio_alloc (& raio -> aio ,
13201323 promises ?
@@ -1330,7 +1333,6 @@ SEXP rnng_request_impl(const SEXP con, const SEXP data, const SEXP sendmode,
13301333 PROTECT (aio = R_MakeExternalPtr (raio , nano_AioSymbol , R_NilValue ));
13311334 R_RegisterCFinalizerEx (aio , request_finalizer , TRUE);
13321335
1333- PROTECT (env = Rf_allocSExp (ENVSXP ));
13341336 NANO_CLASS (env , "recvAio" );
13351337 Rf_defineVar (nano_AioSymbol , aio , env );
13361338
@@ -1344,6 +1346,7 @@ SEXP rnng_request_impl(const SEXP con, const SEXP data, const SEXP sendmode,
13441346 return env ;
13451347
13461348 exitlevel2 :
1349+ UNPROTECT (1 );
13471350 R_Free (raio );
13481351 nng_aio_free (saio -> aio );
13491352 exitlevel1 :
@@ -1358,7 +1361,7 @@ SEXP rnng_request(SEXP con, SEXP data, SEXP sendmode, SEXP recvmode, SEXP timeou
13581361 if (R_ExternalPtrTag (con ) != nano_ContextSymbol )
13591362 Rf_error ("'con' is not a valid Context" );
13601363
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 );
13621365
13631366}
13641367
@@ -1370,18 +1373,18 @@ SEXP rnng_request_signal(SEXP con, SEXP data, SEXP cvar, SEXP sendmode, SEXP rec
13701373 Rf_error ("'cv' is not a valid Condition Variable" );
13711374 nano_cv * ncv = (nano_cv * ) R_ExternalPtrAddr (cvar );
13721375
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 );
13741377
13751378}
13761379
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 ) {
13781381
13791382 if (R_ExternalPtrTag (con ) != nano_ContextSymbol )
13801383 Rf_error ("'con' is not a valid Context" );
13811384
13821385 nano_cv * ncv = R_ExternalPtrTag (cvar ) == nano_CvSymbol ? (nano_cv * ) R_ExternalPtrAddr (cvar ) : NULL ;
13831386
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 );
13851388
13861389}
13871390
0 commit comments