diff options
| author | Garrett D'Amore <garrett@damore.org> | 2018-05-15 11:59:09 -0700 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2018-05-15 11:59:09 -0700 |
| commit | 81808ce3d38cc7ce0131367e2187f0beb2cd1b43 (patch) | |
| tree | 8bc5652bcc0670f48b78c4f344522597875d8eb2 /src/core/endpt.c | |
| parent | 1d033484ee1a2ec26d3eead073e7bc0f889ffdf4 (diff) | |
| download | nng-81808ce3d38cc7ce0131367e2187f0beb2cd1b43.tar.gz nng-81808ce3d38cc7ce0131367e2187f0beb2cd1b43.tar.bz2 nng-81808ce3d38cc7ce0131367e2187f0beb2cd1b43.zip | |
fixes #431 hang in taskq_wait
fixes #429 async websocket reap leads to crash
This tightens up the code for shutdown, ensuring that transport
callbacks are completely stopped before advancing to the next step
of teardown of transport pipes or endpoints.
It also fixes a problem where task_wait would sometimes get "stuck"
as tasks transitioned between asynch and synchronous completions.
Finally, it saves a few cycles by only calling a cancellation callback
once during cancellation of an aio.
Diffstat (limited to 'src/core/endpt.c')
| -rw-r--r-- | src/core/endpt.c | 34 |
1 files changed, 16 insertions, 18 deletions
diff --git a/src/core/endpt.c b/src/core/endpt.c index 87566d42..d39824a4 100644 --- a/src/core/endpt.c +++ b/src/core/endpt.c @@ -23,10 +23,10 @@ struct nni_ep { nni_sock * ep_sock; nni_url * ep_url; int ep_mode; - int ep_started; - int ep_closed; // full shutdown - int ep_closing; // close pending (waiting on refcnt) int ep_refcnt; + bool ep_started; + bool ep_closed; // full shutdown + bool ep_closing; // close pending (waiting on refcnt) bool ep_tmo_run; nni_mtx ep_mtx; nni_cv ep_cv; @@ -138,8 +138,9 @@ nni_ep_create(nni_ep **epp, nni_sock *s, const char *urlstr, int mode) return (NNG_ENOMEM); } ep->ep_url = url; - ep->ep_closed = 0; - ep->ep_started = 0; + ep->ep_closed = false; + ep->ep_closing = false; + ep->ep_started = false; ep->ep_data = NULL; ep->ep_refcnt = 1; ep->ep_sock = s; @@ -237,15 +238,12 @@ nni_ep_rele(nni_ep *ep) int nni_ep_shutdown(nni_ep *ep) { - // This is done under the endpoints lock, although the remove - // is done under that as well, we also make sure that we hold - // the socket lock in the remove step. nni_mtx_lock(&ep->ep_mtx); if (ep->ep_closing) { nni_mtx_unlock(&ep->ep_mtx); return (NNG_ECLOSED); } - ep->ep_closing = 1; + ep->ep_closing = true; nni_mtx_unlock(&ep->ep_mtx); // Abort any remaining in-flight operations. @@ -271,15 +269,15 @@ nni_ep_close(nni_ep *ep) nni_ep_rele(ep); return; } - ep->ep_closed = 1; + ep->ep_closed = true; nni_mtx_unlock(&ep->ep_mtx); nni_ep_shutdown(ep); - nni_aio_close(ep->ep_acc_aio); - nni_aio_close(ep->ep_con_aio); - nni_aio_close(ep->ep_con_syn); - nni_aio_close(ep->ep_tmo_aio); + nni_aio_stop(ep->ep_acc_aio); + nni_aio_stop(ep->ep_con_aio); + nni_aio_stop(ep->ep_con_syn); + nni_aio_stop(ep->ep_tmo_aio); nni_mtx_lock(&ep->ep_mtx); NNI_LIST_FOREACH (&ep->ep_pipes, p) { @@ -435,7 +433,7 @@ nni_ep_dial(nni_ep *ep, int flags) } if ((flags & NNG_FLAG_NONBLOCK) != 0) { - ep->ep_started = 1; + ep->ep_started = true; nni_ep_con_start(ep); nni_mtx_unlock(&ep->ep_mtx); return (0); @@ -444,7 +442,7 @@ nni_ep_dial(nni_ep *ep, int flags) // Synchronous mode: so we have to wait for it to complete. aio = ep->ep_con_syn; ep->ep_ops.ep_connect(ep->ep_data, aio); - ep->ep_started = 1; + ep->ep_started = true; nni_mtx_unlock(&ep->ep_mtx); nni_aio_wait(aio); @@ -453,7 +451,7 @@ nni_ep_dial(nni_ep *ep, int flags) if (((rv = nni_aio_result(aio)) != 0) || ((rv = nni_pipe_create(ep, nni_aio_get_output(aio, 0))) != 0)) { nni_mtx_lock(&ep->ep_mtx); - ep->ep_started = 0; + ep->ep_started = false; nni_mtx_unlock(&ep->ep_mtx); } return (rv); @@ -538,7 +536,7 @@ nni_ep_listen(nni_ep *ep, int flags) return (rv); } - ep->ep_started = 1; + ep->ep_started = true; nni_ep_acc_start(ep); nni_mtx_unlock(&ep->ep_mtx); |
