Skip to content

Commit

Permalink
use own precious list
Browse files Browse the repository at this point in the history
  • Loading branch information
shikokuchuo committed Apr 17, 2024
1 parent f379cb0 commit de7a45d
Show file tree
Hide file tree
Showing 6 changed files with 38 additions and 5 deletions.
2 changes: 1 addition & 1 deletion DESCRIPTION
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Package: nanonext
Type: Package
Title: NNG (Nanomsg Next Gen) Lightweight Messaging Library
Version: 0.13.6.9000
Version: 0.13.6.9001
Description: R binding for NNG (Nanomsg Next Gen), a successor to ZeroMQ. NNG is
a socket library implementing 'Scalability Protocols', a reliable,
high-performance standard for common communications patterns including
Expand Down
5 changes: 4 additions & 1 deletion NEWS.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
# nanonext 0.13.6 (development)
# nanonext 0.13.6.9001 (development)

* Integrates with the `later` package to provide the foundation for truly event-driven promises (thanks @jcheng5 for the initial prototype in #28), where side-effects are enacted upon aio request completions.
* Adds `request_promise()` function for creating a request that may be turned into an event-driven promise.

# nanonext 0.13.6

Expand Down
6 changes: 3 additions & 3 deletions src/aio.c
Original file line number Diff line number Diff line change
Expand Up @@ -254,15 +254,15 @@ static void request_complete_signal(void *arg) {

static void release_object(void *data, Rboolean jump) {
if (jump)
R_ReleaseObject((SEXP) data);
nano_ReleaseObject((SEXP) data);
}

static void raio_invoke_cb(void *arg) {
SEXP call, env = (SEXP) arg;
PROTECT(call = Rf_lcons(CADR(ATTRIB(env)), R_NilValue));
(void) R_UnwindProtect(eval_safe, call, release_object, env, NULL);
UNPROTECT(1);
R_ReleaseObject(env);
nano_ReleaseObject(env);
}

static void raio_complete_cb(void *arg) {
Expand Down Expand Up @@ -1315,7 +1315,7 @@ SEXP rnng_request_impl(const SEXP con, const SEXP data, const SEXP sendmode,
raio->mode = mod;
raio->next = saio;
if (promises) {
R_PreserveObject(env);
nano_PreserveObject(env);
raio->cb = env;
}

Expand Down
24 changes: 24 additions & 0 deletions src/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,30 @@ SEXP mk_error(const int xc) {

}

static SEXP DeleteFromList(SEXP object, SEXP list) {
if (CAR(list) == object) {
return CDR(list);
} else {
SEXP last = list;
for (SEXP head = CDR(list); head != R_NilValue; head = CDR(head)) {
if (CAR(head) == object) {
SETCDR(last, CDR(head));
return list;
}
else last = head;
}
return list;
}
}

void nano_PreserveObject(SEXP object) {
Rf_cons(object, nano_precious);
}

void nano_ReleaseObject(SEXP object) {
nano_precious = DeleteFromList(object, nano_precious);
}

SEXP eval_safe (void *call) {
return Rf_eval((SEXP) call, R_GlobalEnv);
}
Expand Down
3 changes: 3 additions & 0 deletions src/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ SEXP nano_aioFuncs;
SEXP nano_aioNFuncs;
SEXP nano_error;
SEXP nano_klassString;
SEXP nano_precious;
SEXP nano_refHook;
SEXP nano_success;
SEXP nano_unresolved;
Expand Down Expand Up @@ -94,6 +95,7 @@ static void PreserveObjects(void) {
SET_STRING_ELT(CAR(nano_error), 0, Rf_mkChar("errorValue"));
SET_STRING_ELT(CAR(nano_error), 1, Rf_mkChar("try-error"));
R_PreserveObject(nano_klassString = Rf_cons(R_NilValue, R_NilValue));
R_PreserveObject(nano_precious = Rf_cons(R_NilValue, R_NilValue));
R_PreserveObject(nano_refHook = Rf_list2(R_NilValue, R_NilValue));
R_PreserveObject(nano_success = Rf_ScalarInteger(0));
R_PreserveObject(nano_unresolved = Rf_shallow_duplicate(Rf_ScalarLogical(NA_LOGICAL)));
Expand All @@ -104,6 +106,7 @@ static void ReleaseObjects(void) {
R_ReleaseObject(nano_unresolved);
R_ReleaseObject(nano_success);
R_ReleaseObject(nano_refHook);
R_ReleaseObject(nano_precious);
R_ReleaseObject(nano_klassString);
R_ReleaseObject(nano_error);
R_ReleaseObject(nano_aioNFuncs);
Expand Down
3 changes: 3 additions & 0 deletions src/nanonext.h
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,8 @@ typedef struct nano_buf_s {

SEXP mk_error(const int);
SEXP mk_error_ncurl(const int);
void nano_PreserveObject(SEXP);
void nano_ReleaseObject(SEXP);
SEXP eval_safe(void *);
nano_buf nano_char_buf(const SEXP);
SEXP nano_decode(unsigned char *, const size_t, const int);
Expand Down Expand Up @@ -307,6 +309,7 @@ extern SEXP nano_aioFuncs;
extern SEXP nano_aioNFuncs;
extern SEXP nano_error;
extern SEXP nano_klassString;
extern SEXP nano_precious;
extern SEXP nano_refHook;
extern SEXP nano_success;
extern SEXP nano_unresolved;
Expand Down

0 comments on commit de7a45d

Please sign in to comment.