@@ -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