diff options
| author | Garrett D'Amore <garrett@damore.org> | 2016-12-31 14:30:36 -0800 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2016-12-31 14:30:36 -0800 |
| commit | 4e4203fb1cddcfb205d602dd76cd0a8338321ee6 (patch) | |
| tree | 566907bf0c9b5e588f49db8fcb3fa3a681060fbd /src/core/socket.c | |
| parent | 8fe11dfb66acfe067b21b6eb47eb9e3928169950 (diff) | |
| download | nng-4e4203fb1cddcfb205d602dd76cd0a8338321ee6.tar.gz nng-4e4203fb1cddcfb205d602dd76cd0a8338321ee6.tar.bz2 nng-4e4203fb1cddcfb205d602dd76cd0a8338321ee6.zip | |
Close & destroy endpoints in a single operation.
Diffstat (limited to 'src/core/socket.c')
| -rw-r--r-- | src/core/socket.c | 35 |
1 files changed, 10 insertions, 25 deletions
diff --git a/src/core/socket.c b/src/core/socket.c index 6fa6712d..1cba29c2 100644 --- a/src/core/socket.c +++ b/src/core/socket.c @@ -44,6 +44,12 @@ nni_reaper(void *arg) nni_mutex_enter(&sock->s_mx); if ((pipe = nni_list_first(&sock->s_reaps)) != NULL) { nni_list_remove(&sock->s_reaps, pipe); + + if (((ep = pipe->p_ep) != NULL) && + ((ep->ep_pipe == pipe))) { + ep->ep_pipe = NULL; + nni_cond_broadcast(&ep->ep_cv); + } nni_mutex_exit(&sock->s_mx); // This should already have been done. @@ -58,18 +64,6 @@ nni_reaper(void *arg) pipe->p_pdata); } - // If pipe was a connected (dialer) pipe, - // then let the endpoint know so it can try to - // reestablish the connection. - if (((ep = pipe->p_ep) != NULL) && - ((ep->ep_pipe == pipe))) { - ep->ep_pipe = NULL; - pipe->p_ep = NULL; - nni_mutex_enter(&ep->ep_mx); - nni_cond_signal(&ep->ep_cv); - nni_mutex_exit(&ep->ep_mx); - } - // XXX: also publish event... nni_pipe_destroy(pipe); continue; @@ -174,8 +168,11 @@ nni_socket_close(nni_socket *sock) // Stop all EPS. We're going to do this first, since we know // we're closing. - NNI_LIST_FOREACH (&sock->s_eps, ep) { + while ((ep = nni_list_first(&sock->s_eps)) != NULL) { + nni_list_remove(&sock->s_eps, ep); + nni_mutex_exit(&sock->s_mx); nni_endpt_close(ep); + nni_mutex_enter(&sock->s_mx); } // Special optimization; if there are no pipes connected, @@ -225,16 +222,6 @@ nni_socket_close(nni_socket *sock) reaper = sock->s_reaper; sock->s_reaper = NULL; nni_cond_broadcast(&sock->s_cv); - - // We already told the endpoints to shutdown. We just - // need to reap them now. - while ((ep = nni_list_first(&sock->s_eps)) != NULL) { - nni_list_remove(&sock->s_eps, ep); - nni_mutex_exit(&sock->s_mx); - - nni_endpt_destroy(ep); - nni_mutex_enter(&sock->s_mx); - } nni_mutex_exit(&sock->s_mx); // Wait for the reaper to exit. @@ -351,7 +338,6 @@ nni_socket_dial(nni_socket *sock, const char *addr, nni_endpt **epp, int flags) rv = nni_endpt_dial(ep, flags); if (rv != 0) { nni_endpt_close(ep); - nni_endpt_destroy(ep); } else { if (epp != NULL) { *epp = ep; @@ -377,7 +363,6 @@ nni_socket_listen(nni_socket *sock, const char *addr, nni_endpt **epp, rv = nni_endpt_listen(ep, flags); if (rv != 0) { nni_endpt_close(ep); - nni_endpt_destroy(ep); } else { if (epp != NULL) { *epp = ep; |
