Skip to content

Commit 731c1c2

Browse files
committed
RC8; cache ncurl aio activebindings
1 parent 1d93521 commit 731c1c2

File tree

7 files changed

+64
-53
lines changed

7 files changed

+64
-53
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: 0.6.0.9600
4+
Version: 0.6.0.9700
55
Description: R binding for NNG (Nanomsg Next Gen), a successor to ZeroMQ. NNG is
66
a socket library providing high-performance scalability protocols,
77
implementing a cross-platform standard for messaging and communications.

NEWS.md

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

33
#### New Features
44

R/nano.R

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,7 @@ print.nanoStream <- function(x, ...) {
360360
print.recvAio <- function(x, ...) {
361361

362362
if (.subset2(x, "state"))
363-
cat("< recvAio >\n - $data for message data\n - $raw for raw message\n", file = stdout())
363+
cat("< recvAio >\n - $raw for raw message\n - $data for message data\n", file = stdout())
364364
else
365365
cat("< recvAio >\n - $data for message data\n", file = stdout())
366366
invisible(x)
@@ -442,7 +442,7 @@ print.errorValue <- function(x, ...) {
442442
#' @export
443443
#'
444444
.DollarNames.recvAio <- function(x, pattern = "")
445-
grep(pattern, c("data", if (.subset2(x, "state")) "raw"), value = TRUE, fixed = TRUE)
445+
grep(pattern, c(if (.subset2(x, "state")) "raw", "data"), value = TRUE, fixed = TRUE)
446446

447447
#' @export
448448
#'

README.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -237,8 +237,8 @@ complete.
237237
msg <- recv_aio(s2, keep.raw = TRUE)
238238
msg
239239
#> < recvAio >
240-
#> - $data for message data
241240
#> - $raw for raw message
241+
#> - $data for message data
242242
msg$data
243243
#> 'unresolved' logi NA
244244
```
@@ -365,7 +365,7 @@ aio
365365
#> < recvAio >
366366
#> - $data for message data
367367
aio$data |> str()
368-
#> num [1:100000000] 0.2809 0.3156 0.6802 0.0214 -0.428 ...
368+
#> num [1:100000000] 0.521 -1.154 0.624 0.373 -0.547 ...
369369
```
370370

371371
As `call_aio()` is blocking and will wait for completion, an alternative
@@ -526,11 +526,11 @@ ncurl("https://httpbin.org/headers")
526526
#> [1] 7b 0a 20 20 22 68 65 61 64 65 72 73 22 3a 20 7b 0a 20 20 20 20 22 48 6f 73
527527
#> [26] 74 22 3a 20 22 68 74 74 70 62 69 6e 2e 6f 72 67 22 2c 20 0a 20 20 20 20 22
528528
#> [51] 58 2d 41 6d 7a 6e 2d 54 72 61 63 65 2d 49 64 22 3a 20 22 52 6f 6f 74 3d 31
529-
#> [76] 2d 36 33 36 33 65 32 33 64 2d 36 61 35 64 33 64 39 37 31 66 64 35 32 35 31
530-
#> [101] 61 37 61 39 37 36 31 36 30 22 0a 20 20 7d 0a 7d 0a
529+
#> [76] 2d 36 33 36 34 66 31 64 31 2d 31 39 31 35 36 30 63 38 35 61 62 39 36 62 62
530+
#> [101] 32 33 39 61 32 33 31 36 33 22 0a 20 20 7d 0a 7d 0a
531531
#>
532532
#> $data
533-
#> [1] "{\n \"headers\": {\n \"Host\": \"httpbin.org\", \n \"X-Amzn-Trace-Id\": \"Root=1-6363e23d-6a5d3d971fd5251a7a976160\"\n }\n}\n"
533+
#> [1] "{\n \"headers\": {\n \"Host\": \"httpbin.org\", \n \"X-Amzn-Trace-Id\": \"Root=1-6364f1d1-191560c85ab96bb239a23163\"\n }\n}\n"
534534
```
535535

536536
For advanced use, supports additional HTTP methods such as POST or PUT.
@@ -551,13 +551,13 @@ res
551551

552552
call_aio(res)$headers
553553
#> $Date
554-
#> [1] "Thu, 03 Nov 2022 15:46:05 GMT"
554+
#> [1] "Fri, 04 Nov 2022 11:04:50 GMT"
555555
#>
556556
#> $Server
557557
#> [1] "gunicorn/19.9.0"
558558

559559
res$data
560-
#> [1] "{\n \"args\": {}, \n \"data\": \"{\\\"key\\\": \\\"value\\\"}\", \n \"files\": {}, \n \"form\": {}, \n \"headers\": {\n \"Authorization\": \"Bearer APIKEY\", \n \"Content-Length\": \"16\", \n \"Content-Type\": \"application/json\", \n \"Host\": \"httpbin.org\", \n \"X-Amzn-Trace-Id\": \"Root=1-6363e23d-4639d32e5648c7015c23491a\"\n }, \n \"json\": {\n \"key\": \"value\"\n }, \n \"origin\": \"80.169.103.218\", \n \"url\": \"http://httpbin.org/post\"\n}\n"
560+
#> [1] "{\n \"args\": {}, \n \"data\": \"{\\\"key\\\": \\\"value\\\"}\", \n \"files\": {}, \n \"form\": {}, \n \"headers\": {\n \"Authorization\": \"Bearer APIKEY\", \n \"Content-Length\": \"16\", \n \"Content-Type\": \"application/json\", \n \"Host\": \"httpbin.org\", \n \"X-Amzn-Trace-Id\": \"Root=1-6364f1d2-259652e3288ea25d5fb454a3\"\n }, \n \"json\": {\n \"key\": \"value\"\n }, \n \"origin\": \"213.86.169.34\", \n \"url\": \"http://httpbin.org/post\"\n}\n"
561561
```
562562

563563
In this respect, it may be used as a performant and lightweight method
@@ -599,10 +599,10 @@ s |> send('{"action": "subscribe", "symbols": "EURUSD"}')
599599
#> [1] 0
600600

601601
s |> recv()
602-
#> [1] "{\"s\":\"EURUSD\",\"a\":0.9766,\"b\":0.97658,\"dd\":\"-0.0047\",\"dc\":\"-0.4843\",\"ppms\":false,\"t\":1667490367000}"
602+
#> [1] "{\"s\":\"EURUSD\",\"a\":0.9792,\"b\":0.9789,\"dc\":\"0.4371\",\"dd\":\"0.0043\",\"ppms\":false,\"t\":1667559891000}"
603603

604604
s |> recv()
605-
#> [1] "{\"s\":\"EURUSD\",\"a\":0.97657,\"b\":0.97655,\"dc\":\"-0.4874\",\"dd\":\"-0.0048\",\"ppms\":false,\"t\":1667490367000}"
605+
#> [1] "{\"s\":\"EURUSD\",\"a\":0.9791,\"b\":0.97908,\"dc\":\"0.4269\",\"dd\":\"0.0042\",\"ppms\":false,\"t\":1667559892000}"
606606

607607
close(s)
608608
```

src/aio.c

Lines changed: 36 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -135,18 +135,6 @@ static void haio_finalizer(SEXP xptr) {
135135

136136
}
137137

138-
static void create_activebinding(SEXP sym, SEXP env, SEXP clo, const int x) {
139-
140-
SEXP fun;
141-
PROTECT(fun = Rf_allocSExp(CLOSXP));
142-
SET_FORMALS(fun, nano_aioFormals);
143-
SET_BODY(fun, Rf_lang5(nano_DotcallSymbol, nano_RnngHttpSymbol, nano_ContextSymbol, nano_ResponseSymbol, Rf_ScalarInteger(x)));
144-
SET_CLOENV(fun, clo);
145-
R_MakeActiveBinding(sym, fun, env);
146-
UNPROTECT(1);
147-
148-
}
149-
150138
static SEXP mk_error_saio(const int xc, SEXP env) {
151139

152140
SEXP err;
@@ -529,7 +517,7 @@ SEXP rnng_send_aio(SEXP con, SEXP data, SEXP mode, SEXP timeout, SEXP clo) {
529517
Rf_defineVar(nano_AioSymbol, aio, env);
530518
PROTECT(fun = Rf_allocSExp(CLOSXP));
531519
SET_FORMALS(fun, nano_aioFormals);
532-
SET_BODY(fun, CAR(nano_aioFunctions));
520+
SET_BODY(fun, CAR(nano_aioFuncs));
533521
SET_CLOENV(fun, clo);
534522
R_MakeActiveBinding(nano_ResultSymbol, fun, env);
535523
Rf_classgets(env, nano_sendAio);
@@ -638,21 +626,21 @@ SEXP rnng_recv_aio(SEXP con, SEXP mode, SEXP timeout, SEXP keep, SEXP bytes, SEX
638626
REPROTECT(env = Rf_eval(env, clo), pxi);
639627
#endif
640628
Rf_defineVar(nano_AioSymbol, aio, env);
641-
Rf_defineVar(nano_StateSymbol, Rf_ScalarLogical(kpr), env);
629+
Rf_defineVar(nano_StateSymbol, keep, env);
642630

643-
PROTECT(datafun = Rf_allocSExp(CLOSXP));
644-
SET_FORMALS(datafun, nano_aioFormals);
645-
SET_BODY(datafun, CADR(nano_aioFunctions));
646-
SET_CLOENV(datafun, clo);
647631
if (kpr) {
648632
SEXP rawfun;
649633
PROTECT(rawfun = Rf_allocSExp(CLOSXP));
650634
SET_FORMALS(rawfun, nano_aioFormals);
651-
SET_BODY(rawfun, CADDR(nano_aioFunctions));
635+
SET_BODY(rawfun, CADDR(nano_aioFuncs));
652636
SET_CLOENV(rawfun, clo);
653637
R_MakeActiveBinding(nano_RawSymbol, rawfun, env);
654638
UNPROTECT(1);
655639
}
640+
PROTECT(datafun = Rf_allocSExp(CLOSXP));
641+
SET_FORMALS(datafun, nano_aioFormals);
642+
SET_BODY(datafun, CADR(nano_aioFuncs));
643+
SET_CLOENV(datafun, clo);
656644
R_MakeActiveBinding(nano_DataSymbol, datafun, env);
657645
Rf_classgets(env, nano_recvAio);
658646

@@ -761,14 +749,32 @@ SEXP rnng_ncurl_aio(SEXP http, SEXP convert, SEXP method, SEXP headers, SEXP dat
761749
REPROTECT(env = Rf_eval(env, clo), pxi);
762750
#endif
763751
Rf_defineVar(nano_AioSymbol, aio, env);
764-
create_activebinding(nano_StatusSymbol, env, clo, 0);
765-
create_activebinding(nano_HeadersSymbol, env, clo, 1);
766-
create_activebinding(nano_RawSymbol, env, clo, 2);
767-
create_activebinding(nano_DataSymbol, env, clo, 3);
752+
753+
SEXP sfun, hfun, rfun, dfun;
754+
PROTECT(sfun = Rf_allocSExp(CLOSXP));
755+
SET_FORMALS(sfun, nano_aioFormals);
756+
SET_BODY(sfun, CAR(nano_aioNFuncs));
757+
SET_CLOENV(sfun, clo);
758+
R_MakeActiveBinding(nano_StatusSymbol, sfun, env);
759+
PROTECT(hfun = Rf_allocSExp(CLOSXP));
760+
SET_FORMALS(hfun, nano_aioFormals);
761+
SET_BODY(hfun, CADR(nano_aioNFuncs));
762+
SET_CLOENV(hfun, clo);
763+
R_MakeActiveBinding(nano_HeadersSymbol, hfun, env);
764+
PROTECT(rfun = Rf_allocSExp(CLOSXP));
765+
SET_FORMALS(rfun, nano_aioFormals);
766+
SET_BODY(rfun, CADDR(nano_aioNFuncs));
767+
SET_CLOENV(rfun, clo);
768+
R_MakeActiveBinding(nano_RawSymbol, rfun, env);
769+
PROTECT(dfun = Rf_allocSExp(CLOSXP));
770+
SET_FORMALS(dfun, nano_aioFormals);
771+
SET_BODY(dfun, CADDDR(nano_aioNFuncs));
772+
SET_CLOENV(dfun, clo);
773+
R_MakeActiveBinding(nano_DataSymbol, dfun, env);
768774

769775
Rf_classgets(env, nano_ncurlAio);
770776

771-
UNPROTECT(2);
777+
UNPROTECT(6);
772778
return env;
773779

774780
exitlevel7:
@@ -950,22 +956,21 @@ SEXP rnng_request(SEXP con, SEXP data, SEXP sendmode, SEXP recvmode, SEXP timeou
950956
PROTECT(sendaio = R_MakeExternalPtr(saio, R_NilValue, R_NilValue));
951957
R_RegisterCFinalizerEx(sendaio, saio_finalizer, TRUE);
952958
R_MakeWeakRef(aio, sendaio, R_NilValue, TRUE);
959+
Rf_defineVar(nano_StateSymbol, keep, env);
953960

954-
Rf_defineVar(nano_StateSymbol, Rf_ScalarLogical(kpr), env);
955-
956-
PROTECT(datafun = Rf_allocSExp(CLOSXP));
957-
SET_FORMALS(datafun, nano_aioFormals);
958-
SET_BODY(datafun, CADR(nano_aioFunctions));
959-
SET_CLOENV(datafun, clo);
960961
if (kpr) {
961962
SEXP rawfun;
962963
PROTECT(rawfun = Rf_allocSExp(CLOSXP));
963964
SET_FORMALS(rawfun, nano_aioFormals);
964-
SET_BODY(rawfun, CADDR(nano_aioFunctions));
965+
SET_BODY(rawfun, CADDR(nano_aioFuncs));
965966
SET_CLOENV(rawfun, clo);
966967
R_MakeActiveBinding(nano_RawSymbol, rawfun, env);
967968
UNPROTECT(1);
968969
}
970+
PROTECT(datafun = Rf_allocSExp(CLOSXP));
971+
SET_FORMALS(datafun, nano_aioFormals);
972+
SET_BODY(datafun, CADR(nano_aioFuncs));
973+
SET_CLOENV(datafun, clo);
969974
R_MakeActiveBinding(nano_DataSymbol, datafun, env);
970975
Rf_classgets(env, nano_recvAio);
971976

src/init.c

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ SEXP nano_ProtocolSymbol;
3131
SEXP nano_RawSymbol;
3232
SEXP nano_ResponseSymbol;
3333
SEXP nano_ResultSymbol;
34-
SEXP nano_RnngHttpSymbol;
3534
SEXP nano_RtcSymbol;
3635
SEXP nano_SerialSymbol;
3736
SEXP nano_SocketSymbol;
@@ -43,7 +42,8 @@ SEXP nano_UnserSymbol;
4342
SEXP nano_UrlSymbol;
4443

4544
SEXP nano_aioFormals;
46-
SEXP nano_aioFunctions;
45+
SEXP nano_aioFuncs;
46+
SEXP nano_aioNFuncs;
4747
SEXP nano_error;
4848
SEXP nano_ncurlAio;
4949
SEXP nano_recvAio;
@@ -65,7 +65,6 @@ static void RegisterSymbols(void) {
6565
nano_RawSymbol = Rf_install("raw");
6666
nano_ResponseSymbol = Rf_install("response");
6767
nano_ResultSymbol = Rf_install("result");
68-
nano_RnngHttpSymbol = Rf_install("rnng_aio_http");
6968
nano_RtcSymbol = Rf_install("rawToChar");
7069
nano_SerialSymbol = Rf_install("serialize");
7170
nano_SocketSymbol = Rf_install("socket");
@@ -79,12 +78,18 @@ static void RegisterSymbols(void) {
7978

8079
static void PreserveObjects(void) {
8180
R_PreserveObject(nano_aioFormals = Rf_list1(Rf_install(".")));
82-
SEXP result, msgdata, msgraw;
81+
SEXP result, msgdata, msgraw, nstatus, nheaders, nraw, ndata;
8382
PROTECT(result = Rf_lang3(nano_DotcallSymbol, Rf_install("rnng_aio_result"), nano_DataSymbol));
8483
PROTECT(msgdata = Rf_lang3(nano_DotcallSymbol, Rf_install("rnng_aio_get_msgdata"), nano_ResultSymbol));
8584
PROTECT(msgraw = Rf_lang3(nano_DotcallSymbol, Rf_install("rnng_aio_get_msgraw"), nano_ResultSymbol));
86-
R_PreserveObject(nano_aioFunctions = Rf_list3(result, msgdata, msgraw));
87-
UNPROTECT(3);
85+
R_PreserveObject(nano_aioFuncs = Rf_list3(result, msgdata, msgraw));
86+
SEXP nano_AioHttpSymbol = Rf_install("rnng_aio_http");
87+
PROTECT(nstatus = Rf_lang5(nano_DotcallSymbol, nano_AioHttpSymbol, nano_ContextSymbol, nano_ResponseSymbol, Rf_ScalarInteger(0)));
88+
PROTECT(nheaders = Rf_lang5(nano_DotcallSymbol, nano_AioHttpSymbol, nano_ContextSymbol, nano_ResponseSymbol, Rf_ScalarInteger(1)));
89+
PROTECT(nraw = Rf_lang5(nano_DotcallSymbol, nano_AioHttpSymbol, nano_ContextSymbol, nano_ResponseSymbol, Rf_ScalarInteger(2)));
90+
PROTECT(ndata = Rf_lang5(nano_DotcallSymbol, nano_AioHttpSymbol, nano_ContextSymbol, nano_ResponseSymbol, Rf_ScalarInteger(3)));
91+
R_PreserveObject(nano_aioNFuncs = Rf_list4(nstatus, nheaders, nraw, ndata));
92+
UNPROTECT(7);
8893
R_PreserveObject(nano_error = Rf_mkString("errorValue"));
8994
R_PreserveObject(nano_ncurlAio = Rf_allocVector(STRSXP, 2));
9095
SET_STRING_ELT(nano_ncurlAio, 0, Rf_mkChar("ncurlAio"));
@@ -98,7 +103,8 @@ static void PreserveObjects(void) {
98103

99104
static void ReleaseObjects(void) {
100105
R_ReleaseObject(nano_aioFormals);
101-
R_ReleaseObject(nano_aioFunctions);
106+
R_ReleaseObject(nano_aioFuncs);
107+
R_ReleaseObject(nano_aioNFuncs);
102108
R_ReleaseObject(nano_error);
103109
R_ReleaseObject(nano_ncurlAio);
104110
R_ReleaseObject(nano_recvAio);

src/nanonext.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,6 @@ extern SEXP nano_ProtocolSymbol;
9090
extern SEXP nano_RawSymbol;
9191
extern SEXP nano_ResponseSymbol;
9292
extern SEXP nano_ResultSymbol;
93-
extern SEXP nano_RnngHttpSymbol;
9493
extern SEXP nano_RtcSymbol;
9594
extern SEXP nano_SerialSymbol;
9695
extern SEXP nano_SocketSymbol;
@@ -102,7 +101,8 @@ extern SEXP nano_UnserSymbol;
102101
extern SEXP nano_UrlSymbol;
103102

104103
extern SEXP nano_aioFormals;
105-
extern SEXP nano_aioFunctions;
104+
extern SEXP nano_aioFuncs;
105+
extern SEXP nano_aioNFuncs;
106106
extern SEXP nano_error;
107107
extern SEXP nano_ncurlAio;
108108
extern SEXP nano_recvAio;

0 commit comments

Comments
 (0)