diff --git a/src/aio.c b/src/aio.c index fe1ef7c37..986a5894a 100644 --- a/src/aio.c +++ b/src/aio.c @@ -359,8 +359,8 @@ static void iraio_complete_signal(void *arg) { static void saio_finalizer(SEXP xptr) { - if (R_ExternalPtrAddr(xptr) == NULL) return; - nano_aio *xp = (nano_aio *) R_ExternalPtrAddr(xptr); + if (NANO_PTR(xptr) == NULL) return; + nano_aio *xp = (nano_aio *) NANO_PTR(xptr); nng_aio_free(xp->aio); R_Free(xp); @@ -368,8 +368,8 @@ static void saio_finalizer(SEXP xptr) { static void raio_finalizer(SEXP xptr) { - if (R_ExternalPtrAddr(xptr) == NULL) return; - nano_aio *xp = (nano_aio *) R_ExternalPtrAddr(xptr); + if (NANO_PTR(xptr) == NULL) return; + nano_aio *xp = (nano_aio *) NANO_PTR(xptr); nng_aio_free(xp->aio); if (xp->data != NULL) nng_msg_free((nng_msg *) xp->data); @@ -379,8 +379,8 @@ static void raio_finalizer(SEXP xptr) { static void request_finalizer(SEXP xptr) { - if (R_ExternalPtrAddr(xptr) == NULL) return; - nano_aio *xp = (nano_aio *) R_ExternalPtrAddr(xptr); + if (NANO_PTR(xptr) == NULL) return; + nano_aio *xp = (nano_aio *) NANO_PTR(xptr); nano_aio *saio = (nano_aio *) xp->next; nng_aio_free(saio->aio); nng_aio_free(xp->aio); @@ -395,8 +395,8 @@ static void request_finalizer(SEXP xptr) { static void cv_finalizer(SEXP xptr) { - if (R_ExternalPtrAddr(xptr) == NULL) return; - nano_cv *xp = (nano_cv *) R_ExternalPtrAddr(xptr); + if (NANO_PTR(xptr) == NULL) return; + nano_cv *xp = (nano_cv *) NANO_PTR(xptr); nng_cv_free(xp->cv); nng_mtx_free(xp->mtx); R_Free(xp); @@ -405,16 +405,16 @@ static void cv_finalizer(SEXP xptr) { static void cv_duo_finalizer(SEXP xptr) { - if (R_ExternalPtrAddr(xptr) == NULL) return; - nano_cv_duo *xp = (nano_cv_duo *) R_ExternalPtrAddr(xptr); + if (NANO_PTR(xptr) == NULL) return; + nano_cv_duo *xp = (nano_cv_duo *) NANO_PTR(xptr); R_Free(xp); } static void iaio_finalizer(SEXP xptr) { - if (R_ExternalPtrAddr(xptr) == NULL) return; - nano_aio *xp = (nano_aio *) R_ExternalPtrAddr(xptr); + if (NANO_PTR(xptr) == NULL) return; + nano_aio *xp = (nano_aio *) NANO_PTR(xptr); nng_aio_free(xp->aio); if (xp->data != NULL) R_Free(xp->data); @@ -424,8 +424,8 @@ static void iaio_finalizer(SEXP xptr) { static void haio_finalizer(SEXP xptr) { - if (R_ExternalPtrAddr(xptr) == NULL) return; - nano_aio *xp = (nano_aio *) R_ExternalPtrAddr(xptr); + if (NANO_PTR(xptr) == NULL) return; + nano_aio *xp = (nano_aio *) NANO_PTR(xptr); nano_handle *handle = (nano_handle *) xp->next; nng_aio_free(xp->aio); if (xp->data != NULL) @@ -443,8 +443,8 @@ static void haio_finalizer(SEXP xptr) { static void session_finalizer(SEXP xptr) { - if (R_ExternalPtrAddr(xptr) == NULL) return; - nng_http_conn *xp = (nng_http_conn *) R_ExternalPtrAddr(xptr); + if (NANO_PTR(xptr) == NULL) return; + nng_http_conn *xp = (nng_http_conn *) NANO_PTR(xptr); nng_http_conn_close(xp); } @@ -459,7 +459,7 @@ SEXP rnng_aio_result(SEXP env) { const SEXP aio = Rf_findVarInFrame(env, nano_AioSymbol); - nano_aio *saio = (nano_aio *) R_ExternalPtrAddr(aio); + nano_aio *saio = (nano_aio *) NANO_PTR(aio); if (nng_aio_busy(saio->aio)) return nano_unresolved; @@ -481,7 +481,7 @@ SEXP rnng_aio_get_msg(SEXP env) { const SEXP aio = Rf_findVarInFrame(env, nano_AioSymbol); - nano_aio *raio = (nano_aio *) R_ExternalPtrAddr(aio); + nano_aio *raio = (nano_aio *) NANO_PTR(aio); int res; switch (raio->type) { @@ -550,10 +550,10 @@ SEXP rnng_aio_call(SEXP x) { switch (TYPEOF(x)) { case ENVSXP: ; const SEXP coreaio = Rf_findVarInFrame(x, nano_AioSymbol); - if (TAG(coreaio) != nano_AioSymbol) + if (NANO_TAG(coreaio) != nano_AioSymbol) return x; - nano_aio *aiop = (nano_aio *) R_ExternalPtrAddr(coreaio); + nano_aio *aiop = (nano_aio *) NANO_PTR(coreaio); nng_aio_wait(aiop->aio); switch (aiop->type) { case RECVAIO: @@ -635,8 +635,8 @@ SEXP rnng_aio_stop(SEXP x) { switch (TYPEOF(x)) { case ENVSXP: ; const SEXP coreaio = Rf_findVarInFrame(x, nano_AioSymbol); - if (TAG(coreaio) != nano_AioSymbol) break; - nano_aio *aiop = (nano_aio *) R_ExternalPtrAddr(coreaio); + if (NANO_TAG(coreaio) != nano_AioSymbol) break; + nano_aio *aiop = (nano_aio *) NANO_PTR(coreaio); nng_aio_stop(aiop->aio); break; case VECSXP: ; @@ -657,11 +657,11 @@ static int rnng_unresolved_impl(SEXP x) { switch (TYPEOF(x)) { case ENVSXP: ; const SEXP coreaio = Rf_findVarInFrame(x, nano_AioSymbol); - if (TAG(coreaio) != nano_AioSymbol) { + if (NANO_TAG(coreaio) != nano_AioSymbol) { xc = 0; break; } SEXP value; - nano_aio *aio = (nano_aio *) R_ExternalPtrAddr(coreaio); + nano_aio *aio = (nano_aio *) NANO_PTR(coreaio); switch (aio->type) { case SENDAIO: case IOV_SENDAIO: @@ -709,9 +709,9 @@ static int rnng_unresolved2_impl(SEXP x) { if (TYPEOF(x) == ENVSXP) { const SEXP coreaio = Rf_findVarInFrame(x, nano_AioSymbol); - if (TAG(coreaio) != nano_AioSymbol) + if (NANO_TAG(coreaio) != nano_AioSymbol) return 0; - nano_aio *aiop = (nano_aio *) R_ExternalPtrAddr(coreaio); + nano_aio *aiop = (nano_aio *) NANO_PTR(coreaio); return nng_aio_busy(aiop->aio); } @@ -747,7 +747,7 @@ SEXP rnng_send_aio(SEXP con, SEXP data, SEXP mode, SEXP timeout, SEXP clo) { nano_buf buf; int sock, xc; - const SEXP ptrtag = TAG(con); + const SEXP ptrtag = NANO_TAG(con); if ((sock = ptrtag == nano_SocketSymbol) || ptrtag == nano_ContextSymbol) { switch (nano_encodes(mode)) { @@ -774,8 +774,8 @@ SEXP rnng_send_aio(SEXP con, SEXP data, SEXP mode, SEXP timeout, SEXP clo) { nng_aio_set_msg(saio->aio, msg); nng_aio_set_timeout(saio->aio, dur); - sock ? nng_send_aio(*(nng_socket *) R_ExternalPtrAddr(con), saio->aio) : - nng_ctx_send(*(nng_ctx *) R_ExternalPtrAddr(con), saio->aio); + sock ? nng_send_aio(*(nng_socket *) NANO_PTR(con), saio->aio) : + nng_ctx_send(*(nng_ctx *) NANO_PTR(con), saio->aio); NANO_FREE(buf); PROTECT(aio = R_MakeExternalPtr(saio, nano_AioSymbol, R_NilValue)); @@ -785,7 +785,7 @@ SEXP rnng_send_aio(SEXP con, SEXP data, SEXP mode, SEXP timeout, SEXP clo) { nano_encode(&buf, data); - nano_stream *nst = (nano_stream *) R_ExternalPtrAddr(con); + nano_stream *nst = (nano_stream *) NANO_PTR(con); nng_stream *sp = nst->stream; nng_iov iov; @@ -838,13 +838,13 @@ SEXP rnng_send_aio(SEXP con, SEXP data, SEXP mode, SEXP timeout, SEXP clo) { SEXP rnng_recv_aio(SEXP con, SEXP mode, SEXP timeout, SEXP cvar, SEXP bytes, SEXP clo) { const nng_duration dur = timeout == R_NilValue ? NNG_DURATION_DEFAULT : (nng_duration) nano_integer(timeout); - const int signal = TAG(cvar) == nano_CvSymbol; - nano_cv *ncv = signal ? (nano_cv *) R_ExternalPtrAddr(cvar) : NULL; + const int signal = NANO_TAG(cvar) == nano_CvSymbol; + nano_cv *ncv = signal ? (nano_cv *) NANO_PTR(cvar) : NULL; nano_aio *raio; SEXP aio; int mod, sock, xc; - const SEXP ptrtag = TAG(con); + const SEXP ptrtag = NANO_TAG(con); if ((sock = ptrtag == nano_SocketSymbol) || ptrtag == nano_ContextSymbol) { mod = nano_matcharg(mode); @@ -857,8 +857,8 @@ SEXP rnng_recv_aio(SEXP con, SEXP mode, SEXP timeout, SEXP cvar, SEXP bytes, SEX goto exitlevel1; nng_aio_set_timeout(raio->aio, dur); - sock ? nng_recv_aio(*(nng_socket *) R_ExternalPtrAddr(con), raio->aio) : - nng_ctx_recv(*(nng_ctx *) R_ExternalPtrAddr(con), raio->aio); + sock ? nng_recv_aio(*(nng_socket *) NANO_PTR(con), raio->aio) : + nng_ctx_recv(*(nng_ctx *) NANO_PTR(con), raio->aio); PROTECT(aio = R_MakeExternalPtr(raio, nano_AioSymbol, R_NilValue)); R_RegisterCFinalizerEx(aio, raio_finalizer, TRUE); @@ -867,7 +867,7 @@ SEXP rnng_recv_aio(SEXP con, SEXP mode, SEXP timeout, SEXP cvar, SEXP bytes, SEX mod = nano_matchargs(mode); const size_t xlen = (size_t) nano_integer(bytes); - nng_stream **sp = (nng_stream **) R_ExternalPtrAddr(con); + nng_stream **sp = (nng_stream **) NANO_PTR(con); nng_iov iov; raio = R_Calloc(1, nano_aio); @@ -923,7 +923,7 @@ SEXP rnng_ncurl_aio(SEXP http, SEXP convert, SEXP method, SEXP headers, SEXP dat const char *httr = CHAR(STRING_ELT(http, 0)); const char *mthd = method != R_NilValue ? CHAR(STRING_ELT(method, 0)) : NULL; const nng_duration dur = timeout == R_NilValue ? NNG_DURATION_DEFAULT : (nng_duration) nano_integer(timeout); - if (tls != R_NilValue && TAG(tls) != nano_TlsSymbol) + if (tls != R_NilValue && NANO_TAG(tls) != nano_TlsSymbol) Rf_error("'tls' is not a valid TLS Configuration"); nano_aio *haio = R_Calloc(1, nano_aio); nano_handle *handle = R_Calloc(1, nano_handle); @@ -981,7 +981,7 @@ SEXP rnng_ncurl_aio(SEXP http, SEXP convert, SEXP method, SEXP headers, SEXP dat } else { - handle->cfg = (nng_tls_config *) R_ExternalPtrAddr(tls); + handle->cfg = (nng_tls_config *) NANO_PTR(tls); nng_tls_config_hold(handle->cfg); if ((xc = nng_tls_config_server_name(handle->cfg, handle->url->u_hostname)) || @@ -1049,7 +1049,7 @@ static SEXP rnng_aio_http_impl(SEXP env, const int typ) { const SEXP aio = Rf_findVarInFrame(env, nano_AioSymbol); - nano_aio *haio = (nano_aio *) R_ExternalPtrAddr(aio); + nano_aio *haio = (nano_aio *) NANO_PTR(aio); if (nng_aio_busy(haio->aio)) return nano_unresolved; @@ -1136,7 +1136,7 @@ SEXP rnng_ncurl_session(SEXP http, SEXP convert, SEXP method, SEXP headers, SEXP const char *httr = CHAR(STRING_ELT(http, 0)); const char *mthd = method != R_NilValue ? CHAR(STRING_ELT(method, 0)) : NULL; const nng_duration dur = timeout == R_NilValue ? NNG_DURATION_DEFAULT : (nng_duration) nano_integer(timeout); - if (tls != R_NilValue && TAG(tls) != nano_TlsSymbol) + if (tls != R_NilValue && NANO_TAG(tls) != nano_TlsSymbol) Rf_error("'tls' is not a valid TLS Configuration"); nano_aio *haio = R_Calloc(1, nano_aio); @@ -1195,7 +1195,7 @@ SEXP rnng_ncurl_session(SEXP http, SEXP convert, SEXP method, SEXP headers, SEXP } else { - handle->cfg = (nng_tls_config *) R_ExternalPtrAddr(tls); + handle->cfg = (nng_tls_config *) NANO_PTR(tls); nng_tls_config_hold(handle->cfg); if ((xc = nng_tls_config_server_name(handle->cfg, handle->url->u_hostname)) || @@ -1247,12 +1247,12 @@ SEXP rnng_ncurl_session(SEXP http, SEXP convert, SEXP method, SEXP headers, SEXP SEXP rnng_ncurl_transact(SEXP session) { - if (TAG(session) != nano_StatusSymbol) + if (NANO_TAG(session) != nano_StatusSymbol) Rf_error("'session' is not a valid or active ncurlSession"); - nng_http_conn *conn = (nng_http_conn *) R_ExternalPtrAddr(session); + nng_http_conn *conn = (nng_http_conn *) NANO_PTR(session); SEXP aio = Rf_getAttrib(session, nano_AioSymbol); - nano_aio *haio = (nano_aio *) R_ExternalPtrAddr(aio); + nano_aio *haio = (nano_aio *) NANO_PTR(aio); nano_handle *handle = (nano_handle *) haio->next; nng_http_conn_transact(conn, handle->req, handle->res, haio->aio); @@ -1270,7 +1270,7 @@ SEXP rnng_ncurl_transact(SEXP session) { const uint16_t code = nng_http_res_get_status(handle->res); SET_VECTOR_ELT(out, 0, Rf_ScalarInteger(code)); - response = R_ExternalPtrProtected(session); + response = NANO_PROT(session); if (response != R_NilValue) { const R_xlen_t rlen = XLENGTH(response); rvec = Rf_allocVector(VECSXP, rlen); @@ -1303,13 +1303,13 @@ SEXP rnng_ncurl_transact(SEXP session) { SEXP rnng_ncurl_session_close(SEXP session) { - if (TAG(session) != nano_StatusSymbol) + if (NANO_TAG(session) != nano_StatusSymbol) Rf_error("'session' is not a valid or active ncurlSession"); - nng_http_conn *sp = (nng_http_conn *) R_ExternalPtrAddr(session); + nng_http_conn *sp = (nng_http_conn *) NANO_PTR(session); nng_http_conn_close(sp); - SET_TAG(session, R_NilValue); - R_SetExternalPtrProtected(session, R_NilValue); + NANO_SET_TAG(session, R_NilValue); + NANO_SET_PROT(session, R_NilValue); R_ClearExternalPtr(session); Rf_setAttrib(session, nano_AioSymbol, R_NilValue); @@ -1321,7 +1321,7 @@ SEXP rnng_ncurl_session_close(SEXP session) { SEXP rnng_request(SEXP con, SEXP data, SEXP sendmode, SEXP recvmode, SEXP timeout, SEXP cvar, SEXP clo) { - if (TAG(con) != nano_ContextSymbol) + if (NANO_TAG(con) != nano_ContextSymbol) Rf_error("'con' is not a valid Context"); const nng_duration dur = timeout == R_NilValue ? NNG_DURATION_DEFAULT : (nng_duration) nano_integer(timeout); @@ -1331,11 +1331,11 @@ SEXP rnng_request(SEXP con, SEXP data, SEXP sendmode, SEXP recvmode, SEXP timeou signal = 0; drop = 0; } else { - signal = TAG(cvar) == nano_CvSymbol; + signal = NANO_TAG(cvar) == nano_CvSymbol; drop = 1 - signal; } - nng_ctx *ctx = (nng_ctx *) R_ExternalPtrAddr(con); - nano_cv *ncv = signal ? (nano_cv *) R_ExternalPtrAddr(cvar) : NULL; + nng_ctx *ctx = (nng_ctx *) NANO_PTR(con); + nano_cv *ncv = signal ? (nano_cv *) NANO_PTR(cvar) : NULL; SEXP aio, env, fun; nano_buf buf; @@ -1409,10 +1409,10 @@ SEXP rnng_set_promise_context(SEXP x, SEXP ctx) { return x; SEXP aio = Rf_findVarInFrame(x, nano_AioSymbol); - if (TAG(aio) != nano_AioSymbol) + if (NANO_TAG(aio) != nano_AioSymbol) return x; - nano_aio *raio = (nano_aio *) R_ExternalPtrAddr(aio); + nano_aio *raio = (nano_aio *) NANO_PTR(aio); if (eln2 == eln2dummy) { SEXP str, call; @@ -1470,10 +1470,10 @@ SEXP rnng_cv_alloc(void) { SEXP rnng_cv_wait(SEXP cvar) { - if (TAG(cvar) != nano_CvSymbol) + if (NANO_TAG(cvar) != nano_CvSymbol) Rf_error("'cv' is not a valid Condition Variable"); - nano_cv *ncv = (nano_cv *) R_ExternalPtrAddr(cvar); + nano_cv *ncv = (nano_cv *) NANO_PTR(cvar); nng_cv *cv = ncv->cv; nng_mtx *mtx = ncv->mtx; int flag; @@ -1491,10 +1491,10 @@ SEXP rnng_cv_wait(SEXP cvar) { SEXP rnng_cv_until(SEXP cvar, SEXP msec) { - if (TAG(cvar) != nano_CvSymbol) + if (NANO_TAG(cvar) != nano_CvSymbol) Rf_error("'cv' is not a valid Condition Variable"); - nano_cv *ncv = (nano_cv *) R_ExternalPtrAddr(cvar); + nano_cv *ncv = (nano_cv *) NANO_PTR(cvar); nng_cv *cv = ncv->cv; nng_mtx *mtx = ncv->mtx; @@ -1530,10 +1530,10 @@ SEXP rnng_cv_until(SEXP cvar, SEXP msec) { SEXP rnng_cv_wait_safe(SEXP cvar) { - if (TAG(cvar) != nano_CvSymbol) + if (NANO_TAG(cvar) != nano_CvSymbol) Rf_error("'cv' is not a valid Condition Variable"); - nano_cv *ncv = (nano_cv *) R_ExternalPtrAddr(cvar); + nano_cv *ncv = (nano_cv *) NANO_PTR(cvar); nng_cv *cv = ncv->cv; nng_mtx *mtx = ncv->mtx; int signalled; @@ -1565,10 +1565,10 @@ SEXP rnng_cv_wait_safe(SEXP cvar) { SEXP rnng_cv_until_safe(SEXP cvar, SEXP msec) { - if (TAG(cvar) != nano_CvSymbol) + if (NANO_TAG(cvar) != nano_CvSymbol) Rf_error("'cv' is not a valid Condition Variable"); - nano_cv *ncv = (nano_cv *) R_ExternalPtrAddr(cvar); + nano_cv *ncv = (nano_cv *) NANO_PTR(cvar); nng_cv *cv = ncv->cv; nng_mtx *mtx = ncv->mtx; int signalled; @@ -1614,10 +1614,10 @@ SEXP rnng_cv_until_safe(SEXP cvar, SEXP msec) { SEXP rnng_cv_reset(SEXP cvar) { - if (TAG(cvar) != nano_CvSymbol) + if (NANO_TAG(cvar) != nano_CvSymbol) Rf_error("'cv' is not a valid Condition Variable"); - nano_cv *ncv = (nano_cv *) R_ExternalPtrAddr(cvar); + nano_cv *ncv = (nano_cv *) NANO_PTR(cvar); nng_mtx *mtx = ncv->mtx; nng_mtx_lock(mtx); @@ -1631,9 +1631,9 @@ SEXP rnng_cv_reset(SEXP cvar) { SEXP rnng_cv_value(SEXP cvar) { - if (TAG(cvar) != nano_CvSymbol) + if (NANO_TAG(cvar) != nano_CvSymbol) Rf_error("'cv' is not a valid Condition Variable"); - nano_cv *ncv = (nano_cv *) R_ExternalPtrAddr(cvar); + nano_cv *ncv = (nano_cv *) NANO_PTR(cvar); nng_mtx *mtx = ncv->mtx; int cond; nng_mtx_lock(mtx); @@ -1646,10 +1646,10 @@ SEXP rnng_cv_value(SEXP cvar) { SEXP rnng_cv_signal(SEXP cvar) { - if (TAG(cvar) != nano_CvSymbol) + if (NANO_TAG(cvar) != nano_CvSymbol) Rf_error("'cv' is not a valid Condition Variable"); - nano_cv *ncv = (nano_cv *) R_ExternalPtrAddr(cvar); + nano_cv *ncv = (nano_cv *) NANO_PTR(cvar); nng_cv *cv = ncv->cv; nng_mtx *mtx = ncv->mtx; @@ -1666,7 +1666,7 @@ SEXP rnng_cv_signal(SEXP cvar) { SEXP rnng_pipe_notify(SEXP socket, SEXP cv, SEXP cv2, SEXP add, SEXP remove, SEXP flag) { - if (TAG(socket) != nano_SocketSymbol) + if (NANO_TAG(socket) != nano_SocketSymbol) Rf_error("'socket' is not a valid Socket"); int xc; @@ -1674,7 +1674,7 @@ SEXP rnng_pipe_notify(SEXP socket, SEXP cv, SEXP cv2, SEXP add, SEXP remove, SEX if (cv == R_NilValue) { - sock = (nng_socket *) R_ExternalPtrAddr(socket); + sock = (nng_socket *) NANO_PTR(socket); if (NANO_INTEGER(add) && (xc = nng_pipe_notify(*sock, NNG_PIPE_EV_ADD_POST, NULL, NULL))) ERROR_OUT(xc); @@ -1683,12 +1683,12 @@ SEXP rnng_pipe_notify(SEXP socket, SEXP cv, SEXP cv2, SEXP add, SEXP remove, SEX return nano_success; - } else if (TAG(cv) != nano_CvSymbol) { + } else if (NANO_TAG(cv) != nano_CvSymbol) { Rf_error("'cv' is not a valid Condition Variable"); } - sock = (nng_socket *) R_ExternalPtrAddr(socket); - nano_cv *cvp = (nano_cv *) R_ExternalPtrAddr(cv); + sock = (nng_socket *) NANO_PTR(socket); + nano_cv *cvp = (nano_cv *) NANO_PTR(cv); const int flg = NANO_INTEGER(flag); if (cv2 != R_NilValue) { @@ -1699,7 +1699,7 @@ SEXP rnng_pipe_notify(SEXP socket, SEXP cv, SEXP cv2, SEXP add, SEXP remove, SEX cvp->flag = flg < 0 ? 1 : flg; nano_cv_duo *duo = R_Calloc(1, nano_cv_duo); duo->cv = cvp; - duo->cv2 = (nano_cv *) R_ExternalPtrAddr(cv2); + duo->cv2 = (nano_cv *) NANO_PTR(cv2); if (NANO_INTEGER(add) && (xc = nng_pipe_notify(*sock, NNG_PIPE_EV_ADD_POST, pipe_cb_signal_duo, duo))) ERROR_OUT(xc); @@ -1708,7 +1708,7 @@ SEXP rnng_pipe_notify(SEXP socket, SEXP cv, SEXP cv2, SEXP add, SEXP remove, SEX ERROR_OUT(xc); SEXP xptr = R_MakeExternalPtr(duo, R_NilValue, R_NilValue); - R_SetExternalPtrProtected(cv, xptr); + NANO_SET_PROT(cv, xptr); R_RegisterCFinalizerEx(xptr, cv_duo_finalizer, TRUE); } else { @@ -1729,15 +1729,15 @@ SEXP rnng_pipe_notify(SEXP socket, SEXP cv, SEXP cv2, SEXP add, SEXP remove, SEX SEXP rnng_socket_lock(SEXP socket, SEXP cv) { - if (TAG(socket) != nano_SocketSymbol) + if (NANO_TAG(socket) != nano_SocketSymbol) Rf_error("'socket' is not a valid Socket"); - nng_socket *sock = (nng_socket *) R_ExternalPtrAddr(socket); + nng_socket *sock = (nng_socket *) NANO_PTR(socket); int xc; if (cv != R_NilValue) { - if (TAG(cv) != nano_CvSymbol) + if (NANO_TAG(cv) != nano_CvSymbol) Rf_error("'cv' is not a valid Condition Variable"); - nano_cv *ncv = (nano_cv *) R_ExternalPtrAddr(cv); + nano_cv *ncv = (nano_cv *) NANO_PTR(cv); xc = nng_pipe_notify(*sock, NNG_PIPE_EV_ADD_PRE, pipe_cb_dropcon, ncv); } else { xc = nng_pipe_notify(*sock, NNG_PIPE_EV_ADD_PRE, pipe_cb_dropcon, NULL); @@ -1752,10 +1752,10 @@ SEXP rnng_socket_lock(SEXP socket, SEXP cv) { SEXP rnng_socket_unlock(SEXP socket) { - if (TAG(socket) != nano_SocketSymbol) + if (NANO_TAG(socket) != nano_SocketSymbol) Rf_error("'socket' is not a valid Socket"); - nng_socket *sock = (nng_socket *) R_ExternalPtrAddr(socket); + nng_socket *sock = (nng_socket *) NANO_PTR(socket); const int xc = nng_pipe_notify(*sock, NNG_PIPE_EV_ADD_PRE, NULL, NULL); if (xc) diff --git a/src/core.c b/src/core.c index 8a506e6dc..523981a11 100644 --- a/src/core.c +++ b/src/core.c @@ -598,8 +598,8 @@ SEXP nano_decode(unsigned char *buf, const size_t sz, const int mod) { static void context_finalizer(SEXP xptr) { - if (R_ExternalPtrAddr(xptr) == NULL) return; - nng_ctx *xp = (nng_ctx *) R_ExternalPtrAddr(xptr); + if (NANO_PTR(xptr) == NULL) return; + nng_ctx *xp = (nng_ctx *) NANO_PTR(xptr); nng_ctx_close(*xp); R_Free(xp); @@ -607,8 +607,8 @@ static void context_finalizer(SEXP xptr) { void dialer_finalizer(SEXP xptr) { - if (R_ExternalPtrAddr(xptr) == NULL) return; - nano_dialer *xp = (nano_dialer *) R_ExternalPtrAddr(xptr); + if (NANO_PTR(xptr) == NULL) return; + nano_dialer *xp = (nano_dialer *) NANO_PTR(xptr); nng_dialer_close(xp->dial); if (xp->tls != NULL) nng_tls_config_free(xp->tls); @@ -618,8 +618,8 @@ void dialer_finalizer(SEXP xptr) { void listener_finalizer(SEXP xptr) { - if (R_ExternalPtrAddr(xptr) == NULL) return; - nano_listener *xp = (nano_listener *) R_ExternalPtrAddr(xptr); + if (NANO_PTR(xptr) == NULL) return; + nano_listener *xp = (nano_listener *) NANO_PTR(xptr); nng_listener_close(xp->list); if (xp->tls != NULL) nng_tls_config_free(xp->tls); @@ -631,10 +631,10 @@ void listener_finalizer(SEXP xptr) { SEXP rnng_ctx_open(SEXP socket) { - if (TAG(socket) != nano_SocketSymbol) + if (NANO_TAG(socket) != nano_SocketSymbol) Rf_error("'socket' is not a valid Socket"); - nng_socket *sock = (nng_socket *) R_ExternalPtrAddr(socket); + nng_socket *sock = (nng_socket *) NANO_PTR(socket); nng_ctx *ctx = R_Calloc(1, nng_ctx); SEXP context; @@ -660,10 +660,10 @@ SEXP rnng_ctx_open(SEXP socket) { SEXP rnng_ctx_create(SEXP socket) { - if (TAG(socket) != nano_SocketSymbol) + if (NANO_TAG(socket) != nano_SocketSymbol) Rf_error("'socket' is not a valid Socket"); - nng_socket *sock = (nng_socket *) R_ExternalPtrAddr(socket); + nng_socket *sock = (nng_socket *) NANO_PTR(socket); nng_ctx *ctx = R_Calloc(1, nng_ctx); SEXP context; @@ -682,9 +682,9 @@ SEXP rnng_ctx_create(SEXP socket) { SEXP rnng_ctx_close(SEXP context) { - if (TAG(context) != nano_ContextSymbol) + if (NANO_TAG(context) != nano_ContextSymbol) Rf_error("'context' is not a valid Context"); - nng_ctx *ctx = (nng_ctx *) R_ExternalPtrAddr(context); + nng_ctx *ctx = (nng_ctx *) NANO_PTR(context); const int xc = nng_ctx_close(*ctx); if (xc) @@ -699,15 +699,15 @@ SEXP rnng_ctx_close(SEXP context) { SEXP rnng_dial(SEXP socket, SEXP url, SEXP tls, SEXP autostart, SEXP error) { - if (TAG(socket) != nano_SocketSymbol) + if (NANO_TAG(socket) != nano_SocketSymbol) Rf_error("'socket' is not a valid Socket"); const uint8_t sec = tls != R_NilValue; - if (sec && TAG(tls) != nano_TlsSymbol) + if (sec && NANO_TAG(tls) != nano_TlsSymbol) Rf_error("'tls' is not a valid TLS Configuration"); - nng_socket *sock = (nng_socket *) R_ExternalPtrAddr(socket); + nng_socket *sock = (nng_socket *) NANO_PTR(socket); const int start = NANO_INTEGER(autostart); const char *ur = CHAR(STRING_ELT(url, 0)); nano_dialer *dp = R_Calloc(1, nano_dialer); @@ -718,7 +718,7 @@ SEXP rnng_dial(SEXP socket, SEXP url, SEXP tls, SEXP autostart, SEXP error) { if (sec) { if ((xc = nng_dialer_create(&dp->dial, *sock, ur))) goto exitlevel1; - dp->tls = (nng_tls_config *) R_ExternalPtrAddr(tls); + dp->tls = (nng_tls_config *) NANO_PTR(tls); nng_tls_config_hold(dp->tls); if ((xc = nng_url_parse(&up, ur))) goto exitlevel2; @@ -775,15 +775,15 @@ SEXP rnng_dial(SEXP socket, SEXP url, SEXP tls, SEXP autostart, SEXP error) { SEXP rnng_listen(SEXP socket, SEXP url, SEXP tls, SEXP autostart, SEXP error) { - if (TAG(socket) != nano_SocketSymbol) + if (NANO_TAG(socket) != nano_SocketSymbol) Rf_error("'socket' is not a valid Socket"); const uint8_t sec = tls != R_NilValue; - if (sec && TAG(tls) != nano_TlsSymbol) + if (sec && NANO_TAG(tls) != nano_TlsSymbol) Rf_error("'tls' is not a valid TLS Configuration"); - nng_socket *sock = (nng_socket *) R_ExternalPtrAddr(socket); + nng_socket *sock = (nng_socket *) NANO_PTR(socket); const int start = NANO_INTEGER(autostart); const char *ur = CHAR(STRING_ELT(url, 0)); nano_listener *lp = R_Calloc(1, nano_listener); @@ -794,7 +794,7 @@ SEXP rnng_listen(SEXP socket, SEXP url, SEXP tls, SEXP autostart, SEXP error) { if (sec) { if ((xc = nng_listener_create(&lp->list, *sock, ur))) goto exitlevel1; - lp->tls = (nng_tls_config *) R_ExternalPtrAddr(tls); + lp->tls = (nng_tls_config *) NANO_PTR(tls); nng_tls_config_hold(lp->tls); if ((xc = nng_url_parse(&up, ur))) goto exitlevel2; @@ -846,9 +846,9 @@ SEXP rnng_listen(SEXP socket, SEXP url, SEXP tls, SEXP autostart, SEXP error) { SEXP rnng_dialer_start(SEXP dialer, SEXP async) { - if (TAG(dialer) != nano_DialerSymbol) + if (NANO_TAG(dialer) != nano_DialerSymbol) Rf_error("'dialer' is not a valid Dialer"); - nng_dialer *dial = (nng_dialer *) R_ExternalPtrAddr(dialer); + nng_dialer *dial = (nng_dialer *) NANO_PTR(dialer); const int flags = (NANO_INTEGER(async) == 1) * NNG_FLAG_NONBLOCK; const int xc = nng_dialer_start(*dial, flags); if (xc) @@ -861,9 +861,9 @@ SEXP rnng_dialer_start(SEXP dialer, SEXP async) { SEXP rnng_listener_start(SEXP listener) { - if (TAG(listener) != nano_ListenerSymbol) + if (NANO_TAG(listener) != nano_ListenerSymbol) Rf_error("'listener' is not a valid Listener"); - nng_listener *list = (nng_listener *) R_ExternalPtrAddr(listener); + nng_listener *list = (nng_listener *) NANO_PTR(listener); const int xc = nng_listener_start(*list, 0); if (xc) ERROR_RET(xc); @@ -875,9 +875,9 @@ SEXP rnng_listener_start(SEXP listener) { SEXP rnng_dialer_close(SEXP dialer) { - if (TAG(dialer) != nano_DialerSymbol) + if (NANO_TAG(dialer) != nano_DialerSymbol) Rf_error("'dialer' is not a valid Dialer"); - nng_dialer *dial = (nng_dialer *) R_ExternalPtrAddr(dialer); + nng_dialer *dial = (nng_dialer *) NANO_PTR(dialer); const int xc = nng_dialer_close(*dial); if (xc) ERROR_RET(xc); @@ -888,9 +888,9 @@ SEXP rnng_dialer_close(SEXP dialer) { SEXP rnng_listener_close(SEXP listener) { - if (TAG(listener) != nano_ListenerSymbol) + if (NANO_TAG(listener) != nano_ListenerSymbol) Rf_error("'listener' is not a valid Listener"); - nng_listener *list = (nng_listener *) R_ExternalPtrAddr(listener); + nng_listener *list = (nng_listener *) NANO_PTR(listener); const int xc = nng_listener_close(*list); if (xc) ERROR_RET(xc); @@ -907,7 +907,7 @@ SEXP rnng_send(SEXP con, SEXP data, SEXP mode, SEXP block) { nano_buf buf; int xc; - const SEXP ptrtag = TAG(con); + const SEXP ptrtag = NANO_TAG(con); if (ptrtag == nano_SocketSymbol) { switch (nano_encodes(mode)) { @@ -919,7 +919,7 @@ SEXP rnng_send(SEXP con, SEXP data, SEXP mode, SEXP block) { nano_serialize_next(&buf, data); break; } - nng_socket *sock = (nng_socket *) R_ExternalPtrAddr(con); + nng_socket *sock = (nng_socket *) NANO_PTR(con); if (flags <= 0) { @@ -962,7 +962,7 @@ SEXP rnng_send(SEXP con, SEXP data, SEXP mode, SEXP block) { nano_serialize_next(&buf, data); break; } - nng_ctx *ctxp = (nng_ctx *) R_ExternalPtrAddr(con); + nng_ctx *ctxp = (nng_ctx *) NANO_PTR(con); nng_msg *msgp; if (flags <= 0) { @@ -1006,7 +1006,7 @@ SEXP rnng_send(SEXP con, SEXP data, SEXP mode, SEXP block) { nano_encode(&buf, data); - nano_stream *nst = (nano_stream *) R_ExternalPtrAddr(con); + nano_stream *nst = (nano_stream *) NANO_PTR(con); nng_stream *sp = nst->stream; nng_aio *aiop; nng_iov iov; @@ -1052,11 +1052,11 @@ SEXP rnng_recv(SEXP con, SEXP mode, SEXP block, SEXP bytes) { size_t sz; SEXP res; - const SEXP ptrtag = TAG(con); + const SEXP ptrtag = NANO_TAG(con); if (ptrtag == nano_SocketSymbol) { mod = nano_matcharg(mode); - nng_socket *sock = (nng_socket *) R_ExternalPtrAddr(con); + nng_socket *sock = (nng_socket *) NANO_PTR(con); if (flags <= 0) { @@ -1090,7 +1090,7 @@ SEXP rnng_recv(SEXP con, SEXP mode, SEXP block, SEXP bytes) { } else if (ptrtag == nano_ContextSymbol) { mod = nano_matcharg(mode); - nng_ctx *ctxp = (nng_ctx *) R_ExternalPtrAddr(con); + nng_ctx *ctxp = (nng_ctx *) NANO_PTR(con); nng_msg *msgp; if (flags <= 0) { @@ -1132,7 +1132,7 @@ SEXP rnng_recv(SEXP con, SEXP mode, SEXP block, SEXP bytes) { mod = nano_matchargs(mode); const size_t xlen = (size_t) nano_integer(bytes); - nng_stream **sp = (nng_stream **) R_ExternalPtrAddr(con); + nng_stream **sp = (nng_stream **) NANO_PTR(con); nng_iov iov; nng_aio *aiop; @@ -1183,10 +1183,10 @@ SEXP rnng_set_opt(SEXP object, SEXP opt, SEXP value) { const int typ = TYPEOF(value); int xc, val; - const SEXP ptrtag = TAG(object); + const SEXP ptrtag = NANO_TAG(object); if (ptrtag == nano_SocketSymbol) { - nng_socket *sock = (nng_socket *) R_ExternalPtrAddr(object); + nng_socket *sock = (nng_socket *) NANO_PTR(object); switch (typ) { case NILSXP: xc = nng_socket_set(*sock, op, NULL, 0); @@ -1214,7 +1214,7 @@ SEXP rnng_set_opt(SEXP object, SEXP opt, SEXP value) { } else if (ptrtag == nano_ContextSymbol) { - nng_ctx *ctx = (nng_ctx *) R_ExternalPtrAddr(object); + nng_ctx *ctx = (nng_ctx *) NANO_PTR(object); switch (typ) { case NILSXP: xc = nng_ctx_set(*ctx, op, NULL, 0); @@ -1242,7 +1242,7 @@ SEXP rnng_set_opt(SEXP object, SEXP opt, SEXP value) { } else if (ptrtag == nano_StreamSymbol) { - nng_stream **st = (nng_stream **) R_ExternalPtrAddr(object); + nng_stream **st = (nng_stream **) NANO_PTR(object); switch (typ) { case NILSXP: xc = nng_stream_set(*st, op, NULL, 0); @@ -1270,7 +1270,7 @@ SEXP rnng_set_opt(SEXP object, SEXP opt, SEXP value) { } else if (ptrtag == nano_ListenerSymbol) { - nng_listener *list = (nng_listener *) R_ExternalPtrAddr(object); + nng_listener *list = (nng_listener *) NANO_PTR(object); switch (typ) { case NILSXP: xc = nng_listener_set(*list, op, NULL, 0); @@ -1298,7 +1298,7 @@ SEXP rnng_set_opt(SEXP object, SEXP opt, SEXP value) { } else if (ptrtag == nano_DialerSymbol) { - nng_dialer *dial = (nng_dialer *) R_ExternalPtrAddr(object); + nng_dialer *dial = (nng_dialer *) NANO_PTR(object); switch (typ) { case NILSXP: xc = nng_dialer_set(*dial, op, NULL, 0); @@ -1341,16 +1341,16 @@ SEXP rnng_subscribe(SEXP object, SEXP value, SEXP sub) { nano_buf buf; int xc; - const SEXP ptrtag = TAG(object); + const SEXP ptrtag = NANO_TAG(object); if (ptrtag == nano_SocketSymbol) { - nng_socket *sock = (nng_socket *) R_ExternalPtrAddr(object); + nng_socket *sock = (nng_socket *) NANO_PTR(object); nano_encode(&buf, value); xc = nng_socket_set(*sock, op, buf.buf, buf.cur - (TYPEOF(value) == STRSXP)); } else if (ptrtag == nano_ContextSymbol) { - nng_ctx *ctx = (nng_ctx *) R_ExternalPtrAddr(object); + nng_ctx *ctx = (nng_ctx *) NANO_PTR(object); nano_encode(&buf, value); xc = nng_ctx_set(*ctx, op, buf.buf, buf.cur - (TYPEOF(value) == STRSXP)); @@ -1372,10 +1372,10 @@ SEXP rnng_get_opt(SEXP object, SEXP opt) { int xc, typ; nano_opt optval; - const SEXP ptrtag = TAG(object); + const SEXP ptrtag = NANO_TAG(object); if (ptrtag == nano_SocketSymbol) { - nng_socket *sock = (nng_socket *) R_ExternalPtrAddr(object); + nng_socket *sock = (nng_socket *) NANO_PTR(object); for (;;) { xc = nng_socket_get_string(*sock, op, &optval.str); if (xc == 0) { typ = 1; break; } @@ -1393,7 +1393,7 @@ SEXP rnng_get_opt(SEXP object, SEXP opt) { } else if (ptrtag == nano_ContextSymbol) { - nng_ctx *ctx = (nng_ctx *) R_ExternalPtrAddr(object); + nng_ctx *ctx = (nng_ctx *) NANO_PTR(object); for (;;) { xc = nng_ctx_get_string(*ctx, op, &optval.str); if (xc == 0) { typ = 1; break; } @@ -1411,7 +1411,7 @@ SEXP rnng_get_opt(SEXP object, SEXP opt) { } else if (ptrtag == nano_StreamSymbol) { - nng_stream **st = (nng_stream **) R_ExternalPtrAddr(object); + nng_stream **st = (nng_stream **) NANO_PTR(object); for (;;) { xc = nng_stream_get_string(*st, op, &optval.str); if (xc == 0) { typ = 1; break; } @@ -1429,7 +1429,7 @@ SEXP rnng_get_opt(SEXP object, SEXP opt) { } else if (ptrtag == nano_ListenerSymbol) { - nng_listener *list = (nng_listener *) R_ExternalPtrAddr(object); + nng_listener *list = (nng_listener *) NANO_PTR(object); for (;;) { xc = nng_listener_get_string(*list, op, &optval.str); if (xc == 0) { typ = 1; break; } @@ -1447,7 +1447,7 @@ SEXP rnng_get_opt(SEXP object, SEXP opt) { } else if (ptrtag == nano_DialerSymbol) { - nng_dialer *dial = (nng_dialer *) R_ExternalPtrAddr(object); + nng_dialer *dial = (nng_dialer *) NANO_PTR(object); for (;;) { xc = nng_dialer_get_string(*dial, op, &optval.str); if (xc == 0) { typ = 1; break; } @@ -1504,23 +1504,23 @@ SEXP rnng_stats_get(SEXP object, SEXP stat) { int xc; nng_stat *nst, *sst; - const SEXP ptrtag = TAG(object); + const SEXP ptrtag = NANO_TAG(object); if (ptrtag == nano_SocketSymbol) { if ((xc = nng_stats_get(&nst))) ERROR_OUT(xc); - nng_socket *sock = (nng_socket *) R_ExternalPtrAddr(object); + nng_socket *sock = (nng_socket *) NANO_PTR(object); sst = nng_stat_find_socket(nst, *sock); } else if (ptrtag == nano_ListenerSymbol) { if ((xc = nng_stats_get(&nst))) ERROR_OUT(xc); - nng_listener *list = (nng_listener *) R_ExternalPtrAddr(object); + nng_listener *list = (nng_listener *) NANO_PTR(object); sst = nng_stat_find_listener(nst, *list); } else if (ptrtag == nano_DialerSymbol) { if ((xc = nng_stats_get(&nst))) ERROR_OUT(xc); - nng_dialer *dial = (nng_dialer *) R_ExternalPtrAddr(object); + nng_dialer *dial = (nng_dialer *) NANO_PTR(object); sst = nng_stat_find_dialer(nst, *dial); } else { diff --git a/src/nanonext.h b/src/nanonext.h index 26ac10e89..62fae9ea8 100644 --- a/src/nanonext.h +++ b/src/nanonext.h @@ -185,6 +185,11 @@ typedef struct nano_thread_duo_s { #include #include +#define NANO_TAG(x) TAG(x) +#define NANO_PTR(x) (void *) CAR(x) +#define NANO_PROT(x) CDR(x) +#define NANO_SET_TAG(x, v) SET_TAG(x, v) +#define NANO_SET_PROT(x, v) SETCDR(x, v) #define NANO_DATAPTR(x) (void *) DATAPTR_RO(x) #define NANO_VECTOR(x) ((const SEXP *) DATAPTR_RO(x)) #define NANO_INTEGER(x) *(int *) DATAPTR_RO(x) diff --git a/src/protocol.c b/src/protocol.c index c2c9019bf..48ac5a0f3 100644 --- a/src/protocol.c +++ b/src/protocol.c @@ -23,8 +23,8 @@ void socket_finalizer(SEXP xptr) { - if (R_ExternalPtrAddr(xptr) == NULL) return; - nng_socket *xp = (nng_socket *) R_ExternalPtrAddr(xptr); + if (NANO_PTR(xptr) == NULL) return; + nng_socket *xp = (nng_socket *) NANO_PTR(xptr); nng_close(*xp); R_Free(xp); @@ -144,9 +144,9 @@ SEXP rnng_protocol_open(SEXP protocol, SEXP raw) { SEXP rnng_close(SEXP socket) { - if (TAG(socket) != nano_SocketSymbol) + if (NANO_TAG(socket) != nano_SocketSymbol) Rf_error("'socket' is not a valid Socket"); - nng_socket *sock = (nng_socket *) R_ExternalPtrAddr(socket); + nng_socket *sock = (nng_socket *) NANO_PTR(socket); const int xc = nng_close(*sock); if (xc) ERROR_RET(xc); @@ -159,19 +159,19 @@ SEXP rnng_close(SEXP socket) { SEXP rnng_reap(SEXP con) { int xc; - const SEXP ptrtag = TAG(con); + const SEXP ptrtag = NANO_TAG(con); if (ptrtag == nano_ContextSymbol) { - xc = nng_ctx_close(*(nng_ctx *) R_ExternalPtrAddr(con)); + xc = nng_ctx_close(*(nng_ctx *) NANO_PTR(con)); } else if (ptrtag == nano_SocketSymbol) { - xc = nng_close(*(nng_socket *) R_ExternalPtrAddr(con)); + xc = nng_close(*(nng_socket *) NANO_PTR(con)); } else if (ptrtag == nano_ListenerSymbol) { - xc = nng_listener_close(*(nng_listener *) R_ExternalPtrAddr(con)); + xc = nng_listener_close(*(nng_listener *) NANO_PTR(con)); } else if (ptrtag == nano_DialerSymbol) { - xc = nng_dialer_close(*(nng_dialer *) R_ExternalPtrAddr(con)); + xc = nng_dialer_close(*(nng_dialer *) NANO_PTR(con)); } else { xc = 3; diff --git a/src/thread.c b/src/thread.c index fe4681370..bcfb36bff 100644 --- a/src/thread.c +++ b/src/thread.c @@ -28,8 +28,8 @@ static void thread_finalizer(SEXP xptr) { - if (R_ExternalPtrAddr(xptr) == NULL) return; - nng_thread *xp = (nng_thread *) R_ExternalPtrAddr(xptr); + if (NANO_PTR(xptr) == NULL) return; + nng_thread *xp = (nng_thread *) NANO_PTR(xptr); nng_thread_destroy(xp); } @@ -53,7 +53,7 @@ static void rnng_messenger_thread(void *args) { SEXP plist = (SEXP) args; SEXP socket = CADR(plist); SEXP key = CADDR(plist); - nng_socket *sock = (nng_socket *) R_ExternalPtrAddr(socket); + nng_socket *sock = (nng_socket *) NANO_PTR(socket); unsigned char *buf; size_t sz; time_t now; @@ -167,7 +167,7 @@ SEXP rnng_messenger_thread_create(SEXP args) { nng_thread_create(&thr, rnng_messenger_thread, args); SEXP xptr = R_MakeExternalPtr(thr, R_NilValue, R_NilValue); - R_SetExternalPtrProtected(socket, xptr); + NANO_SET_PROT(socket, xptr); R_RegisterCFinalizerEx(xptr, thread_finalizer, TRUE); return socket; @@ -180,8 +180,8 @@ SEXP rnng_messenger_thread_create(SEXP args) { static void thread_aio_finalizer(SEXP xptr) { - if (R_ExternalPtrAddr(xptr) == NULL) return; - nano_thread_aio *xp = (nano_thread_aio *) R_ExternalPtrAddr(xptr); + if (NANO_PTR(xptr) == NULL) return; + nano_thread_aio *xp = (nano_thread_aio *) NANO_PTR(xptr); nano_cv *ncv = xp->cv; nng_mtx *mtx = ncv->mtx; nng_cv *cv = ncv->cv; @@ -196,8 +196,8 @@ static void thread_aio_finalizer(SEXP xptr) { static void thread_duo_finalizer(SEXP xptr) { - if (R_ExternalPtrAddr(xptr) == NULL) return; - nano_thread_duo *xp = (nano_thread_duo *) R_ExternalPtrAddr(xptr); + if (NANO_PTR(xptr) == NULL) return; + nano_thread_duo *xp = (nano_thread_duo *) NANO_PTR(xptr); nano_cv *ncv = xp->cv; nng_mtx *mtx = ncv->mtx; nng_cv *cv = ncv->cv; @@ -234,11 +234,11 @@ SEXP rnng_wait_thread_create(SEXP x) { if (typ == ENVSXP) { const SEXP coreaio = Rf_findVarInFrame(x, nano_AioSymbol); - if (TAG(coreaio) != nano_AioSymbol) + if (NANO_TAG(coreaio) != nano_AioSymbol) return x; PROTECT(coreaio); - nano_aio *aiop = (nano_aio *) R_ExternalPtrAddr(coreaio); + nano_aio *aiop = (nano_aio *) NANO_PTR(coreaio); nano_thread_aio *taio = R_Calloc(1, nano_thread_aio); nano_cv *ncv = R_Calloc(1, nano_cv); @@ -261,7 +261,7 @@ SEXP rnng_wait_thread_create(SEXP x) { nng_thread_create(&taio->thr, rnng_wait_thread, taio); SEXP xptr = R_MakeExternalPtr(taio, R_NilValue, R_NilValue); - R_SetExternalPtrProtected(coreaio, xptr); + NANO_SET_PROT(coreaio, xptr); R_RegisterCFinalizerEx(xptr, thread_aio_finalizer, TRUE); UNPROTECT(1); @@ -372,10 +372,10 @@ static void rnng_signal_thread(void *args) { SEXP rnng_signal_thread_create(SEXP cv, SEXP cv2) { - if (TAG(cv) != nano_CvSymbol) + if (NANO_TAG(cv) != nano_CvSymbol) Rf_error("'cv' is not a valid Condition Variable"); - if (TAG(cv2) != nano_CvSymbol) + if (NANO_TAG(cv2) != nano_CvSymbol) Rf_error("'cv2' is not a valid Condition Variable"); SEXP existing = Rf_getAttrib(cv, R_MissingArg); @@ -384,8 +384,8 @@ SEXP rnng_signal_thread_create(SEXP cv, SEXP cv2) { R_ClearExternalPtr(existing); } - nano_cv *ncv = (nano_cv *) R_ExternalPtrAddr(cv); - nano_cv *ncv2 = (nano_cv *) R_ExternalPtrAddr(cv2); + nano_cv *ncv = (nano_cv *) NANO_PTR(cv); + nano_cv *ncv2 = (nano_cv *) NANO_PTR(cv2); nano_thread_duo *duo = R_Calloc(1, nano_thread_duo); duo->cv = ncv; duo->cv2 = ncv2; diff --git a/src/utils.c b/src/utils.c index 198ae0106..12773d076 100644 --- a/src/utils.c +++ b/src/utils.c @@ -50,8 +50,8 @@ nano_buf nano_char_buf(const SEXP data) { static void stream_finalizer(SEXP xptr) { - if (R_ExternalPtrAddr(xptr) == NULL) return; - nano_stream *xp = (nano_stream *) R_ExternalPtrAddr(xptr); + if (NANO_PTR(xptr) == NULL) return; + nano_stream *xp = (nano_stream *) NANO_PTR(xptr); nng_stream_close(xp->stream); nng_stream_free(xp->stream); if (xp->mode == NANO_STREAM_LISTENER) { @@ -69,8 +69,8 @@ static void stream_finalizer(SEXP xptr) { static void tls_finalizer(SEXP xptr) { - if (R_ExternalPtrAddr(xptr) == NULL) return; - nng_tls_config *xp = (nng_tls_config *) R_ExternalPtrAddr(xptr); + if (NANO_PTR(xptr) == NULL) return; + nng_tls_config *xp = (nng_tls_config *) NANO_PTR(xptr); nng_tls_config_free(xp); } @@ -162,7 +162,7 @@ SEXP rnng_ncurl(SEXP http, SEXP convert, SEXP follow, SEXP method, SEXP headers, const char *addr = CHAR(STRING_ELT(http, 0)); const char *mthd = method != R_NilValue ? CHAR(STRING_ELT(method, 0)) : NULL; const nng_duration dur = timeout == R_NilValue ? NNG_DURATION_DEFAULT : (nng_duration) nano_integer(timeout); - if (tls != R_NilValue && TAG(tls) != nano_TlsSymbol) + if (tls != R_NilValue && NANO_TAG(tls) != nano_TlsSymbol) Rf_error("'tls' is not a valid TLS Configuration"); int chk_resp = response != R_NilValue && TYPEOF(response) == STRSXP; @@ -222,7 +222,7 @@ SEXP rnng_ncurl(SEXP http, SEXP convert, SEXP follow, SEXP method, SEXP headers, goto exitlevel7; } else { - cfg = (nng_tls_config *) R_ExternalPtrAddr(tls); + cfg = (nng_tls_config *) NANO_PTR(tls); nng_tls_config_hold(cfg); if ((xc = nng_tls_config_server_name(cfg, url->u_hostname)) || @@ -337,7 +337,7 @@ SEXP rnng_ncurl(SEXP http, SEXP convert, SEXP follow, SEXP method, SEXP headers, SEXP rnng_stream_dial(SEXP url, SEXP textframes, SEXP tls) { const char *add = CHAR(STRING_ELT(url, 0)); - if (tls != R_NilValue && TAG(tls) != nano_TlsSymbol) + if (tls != R_NilValue && NANO_TAG(tls) != nano_TlsSymbol) Rf_error("'tls' is not a valid TLS Configuration"); nano_stream *nst = R_Calloc(1, nano_stream); nst->mode = NANO_STREAM_DIALER; @@ -374,7 +374,7 @@ SEXP rnng_stream_dial(SEXP url, SEXP textframes, SEXP tls) { goto exitlevel4; } else { - nst->tls = (nng_tls_config *) R_ExternalPtrAddr(tls); + nst->tls = (nng_tls_config *) NANO_PTR(tls); nng_tls_config_hold(nst->tls); if ((xc = nng_tls_config_server_name(nst->tls, up->u_hostname)) || @@ -426,7 +426,7 @@ SEXP rnng_stream_dial(SEXP url, SEXP textframes, SEXP tls) { SEXP rnng_stream_listen(SEXP url, SEXP textframes, SEXP tls) { const char *add = CHAR(STRING_ELT(url, 0)); - if (tls != R_NilValue && TAG(tls) != nano_TlsSymbol) + if (tls != R_NilValue && NANO_TAG(tls) != nano_TlsSymbol) Rf_error("'tls' is not a valid TLS Configuration"); nano_stream *nst = R_Calloc(1, nano_stream); nst->mode = NANO_STREAM_LISTENER; @@ -462,7 +462,7 @@ SEXP rnng_stream_listen(SEXP url, SEXP textframes, SEXP tls) { goto exitlevel4; } else { - nst->tls = (nng_tls_config *) R_ExternalPtrAddr(tls); + nst->tls = (nng_tls_config *) NANO_PTR(tls); nng_tls_config_hold(nst->tls); if ((xc = nng_tls_config_server_name(nst->tls, up->u_hostname)) || @@ -516,11 +516,11 @@ SEXP rnng_stream_listen(SEXP url, SEXP textframes, SEXP tls) { SEXP rnng_stream_close(SEXP stream) { - if (TAG(stream) != nano_StreamSymbol) + if (NANO_TAG(stream) != nano_StreamSymbol) Rf_error("'stream' is not a valid or active Stream"); stream_finalizer(stream); - SET_TAG(stream, R_NilValue); + NANO_SET_TAG(stream, R_NilValue); R_ClearExternalPtr(stream); Rf_setAttrib(stream, nano_StateSymbol, Rf_mkString("closed"));