Skip to content

Commit cfe434a

Browse files
committed
bring back vectorized form of dot unresolved
1 parent 4e9f5e6 commit cfe434a

File tree

9 files changed

+95
-2
lines changed

9 files changed

+95
-2
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.0.0.9021
4+
Version: 1.0.0.9022
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

NAMESPACE

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ S3method(start,nanoListener)
3838
export("%~>%")
3939
export("opt<-")
4040
export(.context)
41+
export(.unresolved)
4142
export(base64dec)
4243
export(base64enc)
4344
export(call_aio)

NEWS.md

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

33
#### New Features
44

R/aio.R

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,3 +331,26 @@ stop_aio <- function(aio) invisible(.Call(rnng_aio_stop, aio))
331331
#' @export
332332
#'
333333
unresolved <- function(aio) .Call(rnng_unresolved, aio)
334+
335+
#' Technical Utility: Query if an Aio is Unresolved
336+
#'
337+
#' Query whether an Aio or list of Aios remains unresolved. This is an
338+
#' experimental technical utility version of \code{\link{unresolved}} not
339+
#' intended for ordinary use. Provides a method of querying the busy status
340+
#' of an Aio without altering its state in any way i.e. not attempting to
341+
#' retrieve the result or message.
342+
#'
343+
#' @inheritParams collect_aio
344+
#'
345+
#' @return Logical TRUE if \sQuote{aio} is an unresolved Aio or else FALSE, or
346+
#' if \sQuote{aio} is a list, the integer number of unresolved Aios in the
347+
#' list.
348+
#'
349+
#' @details \code{.unresolved()} is not intended to be used for \sQuote{recvAio}
350+
#' returned by a signalling function, in which case \code{\link{unresolved}}
351+
#' must be used in all cases.
352+
#'
353+
#' @keywords internal
354+
#' @export
355+
#'
356+
.unresolved <- function(x) .Call(rnng_unresolved2, x)

man/dot-unresolved.Rd

Lines changed: 30 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/aio.c

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -651,6 +651,38 @@ SEXP rnng_unresolved(SEXP x) {
651651

652652
}
653653

654+
static int rnng_unresolved2_impl(SEXP x) {
655+
656+
if (TYPEOF(x) == ENVSXP) {
657+
const SEXP coreaio = Rf_findVarInFrame(x, nano_AioSymbol);
658+
if (R_ExternalPtrTag(coreaio) != nano_AioSymbol)
659+
return 0;
660+
nano_aio *aiop = (nano_aio *) R_ExternalPtrAddr(coreaio);
661+
return nng_aio_busy(aiop->aio);
662+
}
663+
664+
return 0;
665+
666+
}
667+
668+
SEXP rnng_unresolved2(SEXP x) {
669+
670+
switch (TYPEOF(x)) {
671+
case ENVSXP:
672+
return Rf_ScalarLogical(rnng_unresolved2_impl(x));
673+
case VECSXP: ;
674+
int xc = 0;
675+
const R_xlen_t xlen = Rf_xlength(x);
676+
for (R_xlen_t i = 0; i < xlen; i++) {
677+
xc += rnng_unresolved2_impl(VECTOR_ELT(x, i));
678+
}
679+
return Rf_ScalarInteger(xc);
680+
}
681+
682+
return Rf_ScalarLogical(0);
683+
684+
}
685+
654686
// send recv aio functions -----------------------------------------------------
655687

656688
SEXP rnng_send_aio(SEXP con, SEXP data, SEXP mode, SEXP timeout, SEXP clo) {

src/init.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,7 @@ static const R_CallMethodDef callMethods[] = {
203203
{"rnng_subscribe", (DL_FUNC) &rnng_subscribe, 3},
204204
{"rnng_tls_config", (DL_FUNC) &rnng_tls_config, 4},
205205
{"rnng_unresolved", (DL_FUNC) &rnng_unresolved, 1},
206+
{"rnng_unresolved2", (DL_FUNC) &rnng_unresolved2, 1},
206207
{"rnng_url_parse", (DL_FUNC) &rnng_url_parse, 1},
207208
{"rnng_version", (DL_FUNC) &rnng_version, 0},
208209
{"rnng_wait_thread_create", (DL_FUNC) &rnng_wait_thread_create, 1},

src/nanonext.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,7 @@ SEXP rnng_strerror(SEXP);
269269
SEXP rnng_subscribe(SEXP, SEXP, SEXP);
270270
SEXP rnng_tls_config(SEXP, SEXP, SEXP, SEXP);
271271
SEXP rnng_unresolved(SEXP);
272+
SEXP rnng_unresolved2(SEXP);
272273
SEXP rnng_url_parse(SEXP);
273274
SEXP rnng_version(void);
274275
SEXP rnng_wait_thread_create(SEXP);

tests/tests.R

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ saio$newfield <- "doesnotwork"
9393
saio[["newfield"]] <- "doesnotwork"
9494
nanotestn(saio$newfield)
9595
nanotest(is.logical(unresolved(saio)))
96+
nanotest(is.logical(.unresolved(saio)))
9697
nanotestaio(msg <- n1$recv_aio(mode = "numer", timeout = 500))
9798
nanotesti(call_aio(msg), msg)
9899
nanotestaio(msg <- n1$recv_aio(mode = "complex", timeout = 500))
@@ -204,6 +205,7 @@ nanotest(is.integer(req$send("context test", mode ="raw", block = 500)))
204205
nanotest(recv(ctx, mode = "string", block = 500) == "context test")
205206
nanotestnn(req$send(data.frame(), mode = "seri", block = 500))
206207
nanotestaio(msg <- recv_aio(ctx, mode = "ser", timeout = 500))
208+
nanotest(is.logical(.unresolved(msg)))
207209
nanotest(is.logical(unresolved(msg)))
208210
nanotest(is.data.frame(call_aio(msg)$data))
209211
nanotest(!unresolved(msg))
@@ -489,8 +491,10 @@ nanotesterr(context(fakesock), "valid Socket")
489491
nanotesterr(.context(fakesock), "valid Socket")
490492
nanotesterr(stat(fakesock, "pipes"), "valid Socket")
491493
nanotesterr(close(fakesock), "valid Socket")
494+
nanotest(!.unresolved(fakesock))
492495
fakectx <- `class<-`("test", "nanoContext")
493496
nanotest(!unresolved(fakectx))
497+
nanotest(!.unresolved(fakectx))
494498
nanotesterr(request(fakectx, data = "test"), "valid Context")
495499
nanotesterr(subscribe(fakectx, NULL), "valid")
496500
nanotesterr(close(fakectx), "valid Context")
@@ -518,6 +522,7 @@ unres <- `class<-`(NA, "unresolvedValue")
518522
nanotest(!unresolved(unres))
519523
nanotestp(unres)
520524
nanotest(is.logical(unres <- unresolved(list("a", "b"))) && length(unres) == 1L)
525+
nanotest(is.integer(unres <- .unresolved(list("a", "b"))) && length(unres) == 1L)
521526
nanotesti(call_aio("a"), "a")
522527
nanotesti(call_aio_("a"), "a")
523528
nanotesterr(collect_aio_("a"), "object is not an Aio or list of Aios")

0 commit comments

Comments
 (0)