Skip to content

Commit e8e8e12

Browse files
committed
simplify & optimize
1 parent 58a8519 commit e8e8e12

File tree

1 file changed

+31
-32
lines changed

1 file changed

+31
-32
lines changed

src/thread.c

+31-32
Original file line numberDiff line numberDiff line change
@@ -239,14 +239,12 @@ static void thread_disp_finalizer(SEXP xptr) {
239239
if (NANO_PTR(xptr) == NULL) return;
240240
nano_thread_disp *xp = (nano_thread_disp *) NANO_PTR(xptr);
241241
nano_cv *ncv = xp->cv;
242-
if (ncv != NULL) {
243-
nng_mtx *mtx = ncv->mtx;
244-
nng_cv *cv = ncv->cv;
245-
nng_mtx_lock(mtx);
246-
ncv->condition = -1;
247-
nng_cv_wake(cv);
248-
nng_mtx_unlock(mtx);
249-
}
242+
nng_mtx *mtx = ncv->mtx;
243+
nng_cv *cv = ncv->cv;
244+
nng_mtx_lock(mtx);
245+
ncv->condition = -1;
246+
nng_cv_wake(cv);
247+
nng_mtx_unlock(mtx);
250248
if (xp->tls != NULL) {
251249
nng_tls_config_free(xp->tls);
252250
}
@@ -266,6 +264,9 @@ static void thread_disp_finalizer(SEXP xptr) {
266264
R_Free(xp->haio);
267265
R_Free(xp->url);
268266
R_Free(xp->online);
267+
nng_cv_free(ncv->cv);
268+
nng_mtx_free(ncv->mtx);
269+
R_Free(xp->cv);
269270
R_Free(xp);
270271

271272
}
@@ -547,7 +548,7 @@ static void rnng_dispatch_thread(void *args) {
547548
if (nng_rep0_open(&hsock))
548549
goto exitlevel1;
549550

550-
if (nng_dial(hsock, disp->host, &hdial, NNG_FLAG_NONBLOCK))
551+
if (nng_dial(hsock, disp->host, &hdial, 0))
551552
goto exitlevel2;
552553

553554
for (R_xlen_t i = 0; i < n; i++) {
@@ -675,12 +676,17 @@ SEXP rnng_dispatcher_socket(SEXP host, SEXP url, SEXP tls) {
675676
Rf_error("'tls' is not a valid TLS Configuration");
676677

677678
int xc;
678-
SEXP cv, cvt, xptr, sock, list;
679+
SEXP xptr, sock, list;
680+
681+
nano_cv *ncv = R_Calloc(1, nano_cv);
682+
if ((xc = nng_mtx_alloc(&ncv->mtx)))
683+
goto exitlevel1;
684+
685+
if ((xc = nng_cv_alloc(&ncv->cv, ncv->mtx)))
686+
goto exitlevel2;
679687

680-
PROTECT(cvt = rnng_cv_alloc());
681-
nano_cv *tcv = (nano_cv *) NANO_PTR(cvt);
682688
nano_thread_disp *disp = R_Calloc(1, nano_thread_disp);
683-
disp->cv = tcv;
689+
disp->cv = ncv;
684690
disp->n = nd;
685691
disp->tls = sec ? (nng_tls_config *) NANO_PTR(tls) : NULL;
686692
if (sec) nng_tls_config_hold(disp->tls);
@@ -703,22 +709,18 @@ SEXP rnng_dispatcher_socket(SEXP host, SEXP url, SEXP tls) {
703709
nano_listener *hl = R_Calloc(1, nano_listener);
704710

705711
if (nng_url_parse(&disp->up, disp->url[0]))
706-
goto exitlevel1;
712+
goto exitlevel3;
707713

708714
if ((xc = nng_req0_open(hsock)))
709-
goto exitlevel2;
715+
goto exitlevel4;
710716

711-
PROTECT(cv = rnng_cv_alloc());
712-
nano_cv *ncv = (nano_cv *) NANO_PTR(cv);
713717
if ((xc = nng_socket_set_ms(*hsock, "req:resend-time", 0)) ||
714-
(xc = nng_pipe_notify(*hsock, NNG_PIPE_EV_ADD_POST, pipe_cb_signal, ncv)) ||
715718
(xc = nng_listen(*hsock, disp->host, &hl->list, 0)) ||
716719
(xc = nng_thread_create(&disp->thr, rnng_dispatch_thread, disp)))
717-
goto exitlevel3;
720+
goto exitlevel5;
718721

719722
PROTECT(sock = R_MakeExternalPtr(hsock, nano_SocketSymbol, R_NilValue));
720723
R_RegisterCFinalizerEx(sock, socket_finalizer, TRUE);
721-
Rf_setAttrib(sock, nano_CvSymbol, cvt);
722724

723725
xptr = R_MakeExternalPtr(disp, nano_SocketSymbol, R_NilValue);
724726
Rf_setAttrib(sock, R_MissingArg, xptr);
@@ -728,21 +730,14 @@ SEXP rnng_dispatcher_socket(SEXP host, SEXP url, SEXP tls) {
728730
Rf_setAttrib(sock, nano_ListenerSymbol, list);
729731
R_RegisterCFinalizerEx(list, listener_finalizer, TRUE);
730732

731-
rnng_cv_wait(cv);
732-
if ((xc = nng_pipe_notify(*hsock, NNG_PIPE_EV_ADD_POST, NULL, NULL)))
733-
goto exitlevel4;
734-
735-
UNPROTECT(3);
733+
UNPROTECT(1);
736734
return sock;
737735

738-
exitlevel4:
739-
UNPROTECT(1);
740-
exitlevel3:
736+
exitlevel5:
741737
nng_close(*hsock);
742-
UNPROTECT(1);
743-
exitlevel2:
738+
exitlevel4:
744739
nng_url_free(disp->up);
745-
exitlevel1:
740+
exitlevel3:
746741
R_Free(hl);
747742
R_Free(hsock);
748743
for (R_xlen_t i = 0; i < nd; i++) {
@@ -758,7 +753,11 @@ SEXP rnng_dispatcher_socket(SEXP host, SEXP url, SEXP tls) {
758753
R_Free(disp->online);
759754
if (sec) nng_tls_config_free(disp->tls);
760755
R_Free(disp);
761-
UNPROTECT(1);
756+
nng_cv_free(ncv->cv);
757+
exitlevel2:
758+
nng_mtx_free(ncv->mtx);
759+
R_Free(ncv);
760+
exitlevel1:
762761
ERROR_OUT(xc);
763762

764763
}

0 commit comments

Comments
 (0)