Skip to content

Commit fffc2b9

Browse files
authored
More efficient ReqAios (#50)
* minimal struct sendaio * protect one * use official findVarInFrame APIs * remove leftover * awkward interface change
1 parent e115a6a commit fffc2b9

File tree

9 files changed

+41
-52
lines changed

9 files changed

+41
-52
lines changed

DESCRIPTION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
Package: nanonext
22
Type: Package
33
Title: NNG (Nanomsg Next Gen) Lightweight Messaging Library
4-
Version: 1.2.1.9010
4+
Version: 1.2.1.9011
55
Description: R binding for NNG (Nanomsg Next Gen), a successor to ZeroMQ. NNG is
66
a socket library implementing 'Scalability Protocols', a reliable,
77
high-performance standard for common communications patterns including

NEWS.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# nanonext 1.2.1.9010 (development)
1+
# nanonext 1.2.1.9011 (development)
22

33
#### New Features
44

src/aio.c

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -163,11 +163,11 @@ static void iaio_finalizer(SEXP xptr) {
163163

164164
SEXP rnng_aio_result(SEXP env) {
165165

166-
const SEXP exist = nano_findVarInFrame(env, nano_ValueSymbol);
166+
const SEXP exist = FINDVARINFRAME(env, nano_ValueSymbol);
167167
if (exist != R_UnboundValue)
168168
return exist;
169169

170-
const SEXP aio = nano_findVarInFrame(env, nano_AioSymbol);
170+
const SEXP aio = FINDVARINFRAME(env, nano_AioSymbol);
171171

172172
nano_aio *saio = (nano_aio *) NANO_PTR(aio);
173173

@@ -185,11 +185,11 @@ SEXP rnng_aio_result(SEXP env) {
185185

186186
SEXP rnng_aio_get_msg(SEXP env) {
187187

188-
const SEXP exist = nano_findVarInFrame(env, nano_ValueSymbol);
188+
const SEXP exist = FINDVARINFRAME(env, nano_ValueSymbol);
189189
if (exist != R_UnboundValue)
190190
return exist;
191191

192-
const SEXP aio = nano_findVarInFrame(env, nano_AioSymbol);
192+
const SEXP aio = FINDVARINFRAME(env, nano_AioSymbol);
193193

194194
nano_aio *raio = (nano_aio *) NANO_PTR(aio);
195195

@@ -209,14 +209,7 @@ SEXP rnng_aio_get_msg(SEXP env) {
209209
case RECVAIOS:
210210
case REQAIOS:
211211
case IOV_RECVAIOS: ;
212-
nano_cv *ncv;
213-
if (raio->type == REQAIOS) {
214-
nano_aio *saio = (nano_aio *) raio->next;
215-
ncv = (nano_cv *) saio->next;
216-
} else {
217-
ncv = (nano_cv *) raio->next;
218-
}
219-
212+
nano_cv *ncv = (nano_cv *) (raio->type == REQAIOS ? ((nano_sendaio *) raio->next)->next : raio->next);
220213
nng_mtx *mtx = ncv->mtx;
221214
nng_mtx_lock(mtx);
222215
res = raio->result;
@@ -259,7 +252,7 @@ SEXP rnng_aio_call(SEXP x) {
259252

260253
switch (TYPEOF(x)) {
261254
case ENVSXP: ;
262-
const SEXP coreaio = nano_findVarInFrame(x, nano_AioSymbol);
255+
const SEXP coreaio = FINDVARINFRAME(x, nano_AioSymbol);
263256
if (NANO_TAG(coreaio) != nano_AioSymbol)
264257
return x;
265258

@@ -301,7 +294,7 @@ static SEXP rnng_aio_collect_impl(SEXP x, SEXP (*const func)(SEXP)) {
301294

302295
switch (TYPEOF(x)) {
303296
case ENVSXP: ;
304-
out = nano_findVarInFrame(func(x), nano_ValueSymbol);
297+
out = FINDVARINFRAME(func(x), nano_ValueSymbol);
305298
if (out == R_UnboundValue) break;
306299
goto resume;
307300
case VECSXP: ;
@@ -311,7 +304,7 @@ static SEXP rnng_aio_collect_impl(SEXP x, SEXP (*const func)(SEXP)) {
311304
for (R_xlen_t i = 0; i < xlen; i++) {
312305
env = func(NANO_VECTOR(x)[i]);
313306
if (TYPEOF(env) != ENVSXP) goto exit;
314-
env = nano_findVarInFrame(env, nano_ValueSymbol);
307+
env = FINDVARINFRAME(env, nano_ValueSymbol);
315308
if (env == R_UnboundValue) goto exit;
316309
SET_VECTOR_ELT(out, i, env);
317310
}
@@ -346,7 +339,7 @@ SEXP rnng_aio_stop(SEXP x) {
346339

347340
switch (TYPEOF(x)) {
348341
case ENVSXP: ;
349-
const SEXP coreaio = nano_findVarInFrame(x, nano_AioSymbol);
342+
const SEXP coreaio = FINDVARINFRAME(x, nano_AioSymbol);
350343
if (NANO_TAG(coreaio) != nano_AioSymbol) break;
351344
nano_aio *aiop = (nano_aio *) NANO_PTR(coreaio);
352345
nng_aio_stop(aiop->aio);
@@ -368,7 +361,7 @@ static int rnng_unresolved_impl(SEXP x) {
368361
int xc;
369362
switch (TYPEOF(x)) {
370363
case ENVSXP: ;
371-
const SEXP coreaio = nano_findVarInFrame(x, nano_AioSymbol);
364+
const SEXP coreaio = FINDVARINFRAME(x, nano_AioSymbol);
372365
if (NANO_TAG(coreaio) != nano_AioSymbol) {
373366
xc = 0; break;
374367
}
@@ -420,7 +413,7 @@ SEXP rnng_unresolved(SEXP x) {
420413
static int rnng_unresolved2_impl(SEXP x) {
421414

422415
if (TYPEOF(x) == ENVSXP) {
423-
const SEXP coreaio = nano_findVarInFrame(x, nano_AioSymbol);
416+
const SEXP coreaio = FINDVARINFRAME(x, nano_AioSymbol);
424417
if (NANO_TAG(coreaio) != nano_AioSymbol)
425418
return 0;
426419
nano_aio *aiop = (nano_aio *) NANO_PTR(coreaio);

src/core.c

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -176,19 +176,6 @@ inline SEXP R_mkClosure(SEXP formals, SEXP body, SEXP env) {
176176

177177
#endif
178178

179-
SEXP nano_findVarInFrame(const SEXP rho, const SEXP symbol) {
180-
181-
SEXP frame = CAR(rho);
182-
while (frame != R_NilValue) {
183-
if (TAG(frame) == symbol)
184-
return CAR(frame); // BINDING_VALUE
185-
frame = CDR(frame);
186-
}
187-
188-
return R_UnboundValue;
189-
190-
}
191-
192179
inline SEXP nano_PreserveObject(const SEXP x) {
193180

194181
SEXP node = Rf_cons(nano_precious, CDR(nano_precious));

src/nanonext.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,11 @@ typedef struct nano_handle_s {
102102
#define NANO_INTEGER(x) *(int *) DATAPTR_RO(x)
103103
#define NANO_ERROR(x) { Rf_error(x); return R_NilValue; }
104104

105+
#if R_VERSION < R_Version(4, 5, 0)
106+
#define FINDVARINFRAME(env, sym) Rf_findVarInFrame(env, sym)
107+
#else
108+
#define FINDVARINFRAME(env, sym) R_getVarEx(sym, env, FALSE, R_UnboundValue)
109+
#endif
105110
#define ERROR_OUT(xc) Rf_error("%d | %s", xc, nng_strerror(xc))
106111
#define ERROR_RET(xc) { Rf_warning("%d | %s", xc, nng_strerror(xc)); return mk_error(xc); }
107112
#define NANONEXT_INIT_BUFSIZE 8192
@@ -179,6 +184,11 @@ typedef struct nano_aio_s {
179184
nano_aio_typ type;
180185
} nano_aio;
181186

187+
typedef struct nano_sendaio_s {
188+
nng_aio *aio;
189+
void *next;
190+
} nano_sendaio;
191+
182192
typedef struct nano_cv_s {
183193
int condition;
184194
int flag;
@@ -232,7 +242,6 @@ void nano_encode(nano_buf *, const SEXP);
232242
int nano_encodes(const SEXP);
233243
int nano_matcharg(const SEXP);
234244
int nano_matchargs(const SEXP);
235-
SEXP nano_findVarInFrame(const SEXP, const SEXP);
236245
SEXP nano_PreserveObject(const SEXP);
237246
void nano_ReleaseObject(SEXP);
238247
void raio_invoke_cb(void *);

src/ncurl.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,12 @@ static SEXP mk_error_ncurl(const int xc) {
3838

3939
const char *names[] = {"status", "headers", "data", ""};
4040
SEXP out = PROTECT(Rf_mkNamed(VECSXP, names));
41-
SEXP err = Rf_ScalarInteger(xc);
41+
SEXP err = PROTECT(Rf_ScalarInteger(xc));
4242
Rf_classgets(err, nano_error);
4343
SET_VECTOR_ELT(out, 0, err);
4444
SET_VECTOR_ELT(out, 1, err);
4545
SET_VECTOR_ELT(out, 2, err);
46-
UNPROTECT(1);
46+
UNPROTECT(2);
4747
return out;
4848

4949
}
@@ -452,14 +452,14 @@ static SEXP rnng_aio_http_impl(SEXP env, const int typ) {
452452

453453
SEXP exist;
454454
switch (typ) {
455-
case 0: exist = nano_findVarInFrame(env, nano_ResultSymbol); break;
456-
case 1: exist = nano_findVarInFrame(env, nano_ProtocolSymbol); break;
457-
default: exist = nano_findVarInFrame(env, nano_ValueSymbol); break;
455+
case 0: exist = FINDVARINFRAME(env, nano_ResultSymbol); break;
456+
case 1: exist = FINDVARINFRAME(env, nano_ProtocolSymbol); break;
457+
default: exist = FINDVARINFRAME(env, nano_ValueSymbol); break;
458458
}
459459
if (exist != R_UnboundValue)
460460
return exist;
461461

462-
const SEXP aio = nano_findVarInFrame(env, nano_AioSymbol);
462+
const SEXP aio = FINDVARINFRAME(env, nano_AioSymbol);
463463

464464
nano_aio *haio = (nano_aio *) NANO_PTR(aio);
465465

@@ -474,7 +474,7 @@ static SEXP rnng_aio_http_impl(SEXP env, const int typ) {
474474
SEXP out, vec, rvec, response;
475475
nano_handle *handle = (nano_handle *) haio->next;
476476

477-
PROTECT(response = nano_findVarInFrame(env, nano_ResponseSymbol));
477+
PROTECT(response = FINDVARINFRAME(env, nano_ResponseSymbol));
478478
int chk_resp = response != R_NilValue && TYPEOF(response) == STRSXP;
479479
const uint16_t code = nng_http_res_get_status(handle->res), relo = code >= 300 && code < 400;
480480
Rf_defineVar(nano_ResultSymbol, Rf_ScalarInteger(code), env);
@@ -520,9 +520,9 @@ static SEXP rnng_aio_http_impl(SEXP env, const int typ) {
520520
Rf_defineVar(nano_AioSymbol, R_NilValue, env);
521521

522522
switch (typ) {
523-
case 0: out = nano_findVarInFrame(env, nano_ResultSymbol); break;
524-
case 1: out = nano_findVarInFrame(env, nano_ProtocolSymbol); break;
525-
default: out = nano_findVarInFrame(env, nano_ValueSymbol); break;
523+
case 0: out = FINDVARINFRAME(env, nano_ResultSymbol); break;
524+
case 1: out = FINDVARINFRAME(env, nano_ProtocolSymbol); break;
525+
default: out = FINDVARINFRAME(env, nano_ValueSymbol); break;
526526
}
527527
return out;
528528

src/proto.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ SEXP rnng_aio_collect_pipe(SEXP aio) {
223223

224224
if (TYPEOF(aio) != ENVSXP)
225225
goto exitlevel1;
226-
const SEXP coreaio = nano_findVarInFrame(aio, nano_AioSymbol);
226+
const SEXP coreaio = FINDVARINFRAME(aio, nano_AioSymbol);
227227
if (NANO_TAG(coreaio) != nano_AioSymbol)
228228
goto exitlevel1;
229229

src/sync.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,7 @@ static void request_complete_dropcon(void *arg) {
5454
static void request_complete_signal(void *arg) {
5555

5656
nano_aio *raio = (nano_aio *) arg;
57-
nano_aio *saio = (nano_aio *) raio->next;
58-
nano_cv *ncv = (nano_cv *) saio->next;
57+
nano_cv *ncv = (nano_cv *) ((nano_sendaio *) raio->next)->next;
5958
nng_cv *cv = ncv->cv;
6059
nng_mtx *mtx = ncv->mtx;
6160

@@ -181,7 +180,7 @@ static void request_finalizer(SEXP xptr) {
181180

182181
if (NANO_PTR(xptr) == NULL) return;
183182
nano_aio *xp = (nano_aio *) NANO_PTR(xptr);
184-
nano_aio *saio = (nano_aio *) xp->next;
183+
nano_sendaio *saio = (nano_sendaio *) xp->next;
185184
nng_aio_free(saio->aio);
186185
nng_aio_free(xp->aio);
187186
if (xp->data != NULL)
@@ -439,12 +438,13 @@ SEXP rnng_request(SEXP con, SEXP data, SEXP sendmode, SEXP recvmode, SEXP timeou
439438

440439
SEXP aio, env, fun;
441440
nano_buf buf;
442-
nano_aio *saio, *raio;
441+
nano_sendaio *saio;
442+
nano_aio *raio;
443443
nng_msg *msg;
444444
int xc;
445445

446446
nano_encodes(sendmode) == 2 ? nano_encode(&buf, data) : nano_serialize(&buf, data, NANO_PROT(con));
447-
saio = R_Calloc(1, nano_aio);
447+
saio = R_Calloc(1, nano_sendaio);
448448
saio->next = ncv;
449449

450450
if ((xc = nng_msg_alloc(&msg, 0)))
@@ -500,7 +500,7 @@ SEXP rnng_create_promise(SEXP x, SEXP ctx) {
500500
if (TYPEOF(x) != ENVSXP)
501501
return R_NilValue;
502502

503-
SEXP aio = nano_findVarInFrame(x, nano_AioSymbol);
503+
SEXP aio = FINDVARINFRAME(x, nano_AioSymbol);
504504
if (NANO_TAG(aio) != nano_AioSymbol)
505505
return R_NilValue;
506506

src/thread.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ SEXP rnng_wait_thread_create(SEXP x) {
234234
const SEXPTYPE typ = TYPEOF(x);
235235
if (typ == ENVSXP) {
236236

237-
const SEXP coreaio = nano_findVarInFrame(x, nano_AioSymbol);
237+
const SEXP coreaio = FINDVARINFRAME(x, nano_AioSymbol);
238238
if (NANO_TAG(coreaio) != nano_AioSymbol)
239239
return x;
240240

0 commit comments

Comments
 (0)