From d4d49cef92356778215c757e8f6d1d0d35662a64 Mon Sep 17 00:00:00 2001 From: Garrett D'Amore Date: Wed, 18 Jul 2018 13:23:58 -0700 Subject: fixes #601 pipe destroy can fail to close pipe --- src/core/dialer.c | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) (limited to 'src/core/dialer.c') diff --git a/src/core/dialer.c b/src/core/dialer.c index 3144d673..34e90891 100644 --- a/src/core/dialer.c +++ b/src/core/dialer.c @@ -92,14 +92,14 @@ nni_dialer_create(nni_dialer **dp, nni_sock *s, const char *urlstr) nni_url_free(url); return (NNG_ENOMEM); } - d->d_url = url; - d->d_closed = false; - d->d_data = NULL; - d->d_refcnt = 1; - d->d_sock = s; - d->d_tran = tran; + d->d_url = url; + d->d_closed = false; + d->d_closing = false; + d->d_data = NULL; + d->d_refcnt = 1; + d->d_sock = s; + d->d_tran = tran; nni_atomic_flag_reset(&d->d_started); - nni_atomic_flag_reset(&d->d_closing); // Make a copy of the endpoint operations. This allows us to // modify them (to override NULLs for example), and avoids an extra @@ -174,6 +174,27 @@ nni_dialer_rele(nni_dialer *d) nni_mtx_unlock(&dialers_lk); } +void +nni_dialer_close_rele(nni_dialer *d) +{ + nni_mtx_lock(&dialers_lk); + if (d->d_closed) { + nni_mtx_unlock(&dialers_lk); + nni_dialer_rele(d); + return; + } + d->d_closed = true; + nni_mtx_unlock(&dialers_lk); + + // Remove us from the table so we cannot be found. + // This is done fairly early in the teardown process. + // If we're here, either the socket or the listener has been + // closed at the user request, so there would be a race anyway. + nni_idhash_remove(dialers, d->d_id); + + nni_dialer_rele(d); +} + void nni_dialer_close(nni_dialer *d) { -- cgit v1.2.3-70-g09d2