diff options
| author | Garrett D'Amore <garrett@damore.org> | 2018-07-18 13:23:58 -0700 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2018-07-18 15:54:32 -0700 |
| commit | d4d49cef92356778215c757e8f6d1d0d35662a64 (patch) | |
| tree | f28de7321f0b301faea84cd38ce137db2b126dbc /src/core/dialer.c | |
| parent | b310f712828962bf3187caf3bfe064c3531c5628 (diff) | |
| download | nng-d4d49cef92356778215c757e8f6d1d0d35662a64.tar.gz nng-d4d49cef92356778215c757e8f6d1d0d35662a64.tar.bz2 nng-d4d49cef92356778215c757e8f6d1d0d35662a64.zip | |
fixes #601 pipe destroy can fail to close pipe
Diffstat (limited to 'src/core/dialer.c')
| -rw-r--r-- | src/core/dialer.c | 35 |
1 files changed, 28 insertions, 7 deletions
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 @@ -175,6 +175,27 @@ nni_dialer_rele(nni_dialer *d) } 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) { nni_mtx_lock(&dialers_lk); |
