Skip to content

Commit f379cb0

Browse files
committed
simplify
1 parent 0af45c3 commit f379cb0

File tree

4 files changed

+22
-23
lines changed

4 files changed

+22
-23
lines changed

R/context.R

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -280,8 +280,4 @@ request_promise <- function(context,
280280
recv_mode = c("serial", "character", "complex", "double",
281281
"integer", "logical", "numeric", "raw", "string"),
282282
timeout = NULL)
283-
data <- .Call(rnng_request_promise, context, data, cv, send_mode, recv_mode, timeout, environment(),
284-
function() {
285-
cb <- .subset2(data, "callback")
286-
if (is.function(cb)) cb(data)
287-
})
283+
data <- .Call(rnng_request_promise, context, data, cv, send_mode, recv_mode, timeout, environment())

src/aio.c

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -258,11 +258,11 @@ static void release_object(void *data, Rboolean jump) {
258258
}
259259

260260
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);
264264
UNPROTECT(1);
265-
R_ReleaseObject(data);
265+
R_ReleaseObject(env);
266266
}
267267

268268
static 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

12691271
SEXP 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

src/init.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ static const R_CallMethodDef callMethods[] = {
158158
{"rnng_recv_aio", (DL_FUNC) &rnng_recv_aio, 5},
159159
{"rnng_recv_aio_signal", (DL_FUNC) &rnng_recv_aio_signal, 6},
160160
{"rnng_request", (DL_FUNC) &rnng_request, 6},
161-
{"rnng_request_promise", (DL_FUNC) &rnng_request_promise, 8},
161+
{"rnng_request_promise", (DL_FUNC) &rnng_request_promise, 7},
162162
{"rnng_request_signal", (DL_FUNC) &rnng_request_signal, 7},
163163
{"rnng_send", (DL_FUNC) &rnng_send, 4},
164164
{"rnng_send_aio", (DL_FUNC) &rnng_send_aio, 5},

src/nanonext.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ SEXP rnng_recv(SEXP, SEXP, SEXP, SEXP);
255255
SEXP rnng_recv_aio(SEXP, SEXP, SEXP, SEXP, SEXP);
256256
SEXP rnng_recv_aio_signal(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP);
257257
SEXP rnng_request(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP);
258-
SEXP rnng_request_promise(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP);
258+
SEXP rnng_request_promise(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP);
259259
SEXP rnng_request_signal(SEXP, SEXP, SEXP, SEXP, SEXP, SEXP, SEXP);
260260
SEXP rnng_send(SEXP, SEXP, SEXP, SEXP);
261261
SEXP rnng_send_aio(SEXP, SEXP, SEXP, SEXP, SEXP);

0 commit comments

Comments
 (0)