summaryrefslogtreecommitdiff
path: root/src/core/dialer.c
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2018-07-18 13:23:58 -0700
committerGarrett D'Amore <garrett@damore.org>2018-07-18 15:54:32 -0700
commitd4d49cef92356778215c757e8f6d1d0d35662a64 (patch)
treef28de7321f0b301faea84cd38ce137db2b126dbc /src/core/dialer.c
parentb310f712828962bf3187caf3bfe064c3531c5628 (diff)
downloadnng-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.c35
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);