Skip to content

Commit da18ea4

Browse files
committed
RC3; faster attaching listeners/dialers
1 parent 913b9b8 commit da18ea4

File tree

3 files changed

+38
-34
lines changed

3 files changed

+38
-34
lines changed

R/nano.R

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,9 @@ nano <- function(protocol = c("bus", "pair", "push", "pull", "pub", "sub",
102102
opt = opt,
103103
value = value))
104104
if (!autostart) nano[["dialer_start"]] <- function(async = TRUE) {
105-
rm("dialer_start", envir = nano)
106-
start(.subset2(nano, "dialer")[[1L]], async = async)
105+
s <- start(.subset2(nano, "dialer")[[1L]], async = async)
106+
if (s == 0L) rm("dialer_start", envir = nano)
107+
invisible(s)
107108
}
108109
}
109110
}
@@ -121,8 +122,9 @@ nano <- function(protocol = c("bus", "pair", "push", "pull", "pub", "sub",
121122
opt = opt,
122123
value = value))
123124
if (!autostart) nano[["listener_start"]] <- function() {
124-
rm("listener_start", envir = nano)
125-
start(.subset2(nano, "listener")[[1L]])
125+
s <- start(.subset2(nano, "listener")[[1L]])
126+
if (s == 0L) rm("listener_start", envir = nano)
127+
invisible(s)
126128
}
127129
}
128130
}
@@ -142,8 +144,9 @@ nano <- function(protocol = c("bus", "pair", "push", "pull", "pub", "sub",
142144
opt = opt,
143145
value = value))
144146
if (!autostart) nano[["dialer_start"]] <- function(async = TRUE) {
145-
rm("dialer_start", envir = nano)
146-
start((d <- .subset2(nano, "dialer"))[[length(d)]], async = async)
147+
s <- start((d <- .subset2(nano, "dialer"))[[length(d)]], async = async)
148+
if (s == 0L) rm("dialer_start", envir = nano)
149+
invisible(s)
147150
}
148151
}
149152
invisible(r)
@@ -162,8 +165,9 @@ nano <- function(protocol = c("bus", "pair", "push", "pull", "pub", "sub",
162165
opt = opt,
163166
value = value))
164167
if (!autostart) nano[["listener_start"]] <- function() {
165-
rm("listener_start", envir = nano)
166-
start((l <- .subset2(nano, "listener"))[[length(l)]])
168+
s <- start((l <- .subset2(nano, "listener"))[[length(l)]])
169+
if (s == 0L) rm("listener_start", envir = nano)
170+
invisible(s)
167171
}
168172
}
169173
invisible(r)

README.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,7 @@ aio
365365
#> < recvAio >
366366
#> - $data for message data
367367
aio$data |> str()
368-
#> num [1:100000000] 0.612 -0.988 0.695 1.556 -0.303 ...
368+
#> num [1:100000000] -0.177 -2.62 1.421 -1.42 -0.17 ...
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 32 62 66 61 36 2d 32 35 65 63 61 62 39 38 37 61 33 66 62 66 36
530-
#> [101] 61 30 63 63 33 63 32 36 64 22 0a 20 20 7d 0a 7d 0a
529+
#> [76] 2d 36 33 36 32 65 31 37 31 2d 35 39 63 36 39 31 61 62 34 33 63 30 33 31 36
530+
#> [101] 33 34 34 66 31 61 66 35 34 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-6362bfa6-25ecab987a3fbf6a0cc3c26d\"\n }\n}\n"
533+
#> [1] "{\n \"headers\": {\n \"Host\": \"httpbin.org\", \n \"X-Amzn-Trace-Id\": \"Root=1-6362e171-59c691ab43c0316344f1af54\"\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] "Wed, 02 Nov 2022 19:06:14 GMT"
554+
#> [1] "Wed, 02 Nov 2022 21:30:25 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-6362bfa6-4df434e66991ffe84e12d0e7\"\n }, \n \"json\": {\n \"key\": \"value\"\n }, \n \"origin\": \"185.225.45.49\", \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-6362e171-6bd749534693d660717763d4\"\n }, \n \"json\": {\n \"key\": \"value\"\n }, \n \"origin\": \"185.225.45.49\", \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.98849,\"b\":0.98843,\"dc\":\"0.0789\",\"dd\":\"0.0008\",\"ppms\":false,\"t\":1667415975000}"
602+
#> [1] "{\"s\":\"EURUSD\",\"a\":0.982,\"b\":0.9817,\"dc\":\"-0.5815\",\"dd\":\"-0.0057\",\"ppms\":false,\"t\":1667424628000}"
603603

604604
s |> recv()
605-
#> [1] "{\"s\":\"EURUSD\",\"a\":0.98846,\"b\":0.98839,\"dc\":\"0.0759\",\"dd\":\"0.0008\",\"ppms\":false,\"t\":1667415975000}"
605+
#> [1] "{\"s\":\"EURUSD\",\"a\":0.9819,\"b\":0.9816,\"dc\":\"-0.5917\",\"dd\":\"-0.0058\",\"ppms\":false,\"t\":1667424634000}"
606606

607607
close(s)
608608
```

src/core.c

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -510,7 +510,7 @@ SEXP rnng_dial(SEXP socket, SEXP url, SEXP autostart) {
510510
const char *up = CHAR(STRING_ELT(url, 0));
511511
const int start = LOGICAL(autostart)[0];
512512
nng_dialer *dp = R_Calloc(1, nng_dialer);
513-
SEXP dialer, klass, attr;
513+
SEXP dialer, klass, attr, newattr;
514514

515515
const int xc = start ? nng_dial(*sock, up, dp, NNG_FLAG_NONBLOCK) : nng_dialer_create(dp, *sock, up);
516516
if (xc) {
@@ -535,16 +535,16 @@ SEXP rnng_dial(SEXP socket, SEXP url, SEXP autostart) {
535535

536536
attr = Rf_getAttrib(socket, nano_DialerSymbol);
537537
if (attr == R_NilValue) {
538-
PROTECT(attr = Rf_allocVector(VECSXP, 1));
539-
SET_VECTOR_ELT(attr, 0, dialer);
538+
PROTECT(newattr = Rf_allocVector(VECSXP, 1));
539+
SET_VECTOR_ELT(newattr, 0, dialer);
540540
} else {
541-
R_xlen_t pos = Rf_xlength(attr);
542-
PROTECT_INDEX pxi;
543-
PROTECT_WITH_INDEX(attr, &pxi);
544-
REPROTECT(attr = Rf_xlengthgets(attr, pos + 1), pxi);
545-
SET_VECTOR_ELT(attr, pos, dialer);
541+
R_xlen_t xlen = Rf_xlength(attr);
542+
PROTECT(newattr = Rf_allocVector(VECSXP, xlen + 1));
543+
for (R_xlen_t i = 0; i < xlen; i++)
544+
SET_VECTOR_ELT(newattr, i, VECTOR_ELT(attr, i));
545+
SET_VECTOR_ELT(newattr, xlen, dialer);
546546
}
547-
Rf_setAttrib(socket, nano_DialerSymbol, attr);
547+
Rf_setAttrib(socket, nano_DialerSymbol, newattr);
548548

549549
UNPROTECT(3);
550550
return nano_success;
@@ -559,7 +559,7 @@ SEXP rnng_listen(SEXP socket, SEXP url, SEXP autostart) {
559559
const char *up = CHAR(STRING_ELT(url, 0));
560560
const int start = LOGICAL(autostart)[0];
561561
nng_listener *lp = R_Calloc(1, nng_listener);
562-
SEXP listener, klass, attr;
562+
SEXP listener, klass, attr, newattr;
563563

564564
const int xc = start ? nng_listen(*sock, up, lp, 0) : nng_listener_create(lp, *sock, up);
565565
if (xc) {
@@ -584,16 +584,16 @@ SEXP rnng_listen(SEXP socket, SEXP url, SEXP autostart) {
584584

585585
attr = Rf_getAttrib(socket, nano_ListenerSymbol);
586586
if (attr == R_NilValue) {
587-
PROTECT(attr = Rf_allocVector(VECSXP, 1));
588-
SET_VECTOR_ELT(attr, 0, listener);
587+
PROTECT(newattr = Rf_allocVector(VECSXP, 1));
588+
SET_VECTOR_ELT(newattr, 0, listener);
589589
} else {
590-
R_xlen_t pos = Rf_xlength(attr);
591-
PROTECT_INDEX pxi;
592-
PROTECT_WITH_INDEX(attr, &pxi);
593-
REPROTECT(attr = Rf_xlengthgets(attr, pos + 1), pxi);
594-
SET_VECTOR_ELT(attr, pos, listener);
590+
R_xlen_t xlen = Rf_xlength(attr);
591+
PROTECT(newattr = Rf_allocVector(VECSXP, xlen + 1));
592+
for (R_xlen_t i = 0; i < xlen; i++)
593+
SET_VECTOR_ELT(newattr, i, VECTOR_ELT(attr, i));
594+
SET_VECTOR_ELT(newattr, xlen, listener);
595595
}
596-
Rf_setAttrib(socket, nano_ListenerSymbol, attr);
596+
Rf_setAttrib(socket, nano_ListenerSymbol, newattr);
597597

598598
UNPROTECT(3);
599599
return nano_success;

0 commit comments

Comments
 (0)