diff options
| author | Garrett D'Amore <garrett@damore.org> | 2021-09-04 17:27:54 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-09-04 17:27:54 -0700 |
| commit | d137bf383892c53265593d9a5ac17e64444091c9 (patch) | |
| tree | d06570c8f18d47057ff2158f5a9e5fd92e5cfeaf /src/core/dialer.c | |
| parent | d4b91214c125de33d2e8d3f52fecd8eac18e476c (diff) | |
| download | nng-d137bf383892c53265593d9a5ac17e64444091c9.tar.gz nng-d137bf383892c53265593d9a5ac17e64444091c9.tar.bz2 nng-d137bf383892c53265593d9a5ac17e64444091c9.zip | |
fixes #1498 Endpoint close/shutdown could be synchronous (#1499)
Diffstat (limited to 'src/core/dialer.c')
| -rw-r--r-- | src/core/dialer.c | 58 |
1 files changed, 27 insertions, 31 deletions
diff --git a/src/core/dialer.c b/src/core/dialer.c index a9674226..4c3e563d 100644 --- a/src/core/dialer.c +++ b/src/core/dialer.c @@ -225,15 +225,20 @@ nni_dialer_bump_error(nni_dialer *d, int err) #endif } +// nni_dialer_create creates a dialer on the socket. +// The caller should have a hold on the socket, and on success +// the dialer inherits the callers hold. (If the caller wants +// an additional hold, it should get an extra hold before calling this +// function.) int -nni_dialer_create(nni_dialer **dp, nni_sock *s, const char *urlstr) +nni_dialer_create(nni_dialer **dp, nni_sock *s, const char *url_str) { - nni_sp_tran * tran; - nni_dialer *d; - int rv; - nni_url * url; + nni_sp_tran *tran; + nni_dialer *d; + int rv; + nni_url *url; - if ((rv = nni_url_parse(&url, urlstr)) != 0) { + if ((rv = nni_url_parse(&url, url_str)) != 0) { return (rv); } if (((tran = nni_sp_tran_find(url)) == NULL) || @@ -246,13 +251,12 @@ 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_closing = false; - d->d_data = NULL; - d->d_ref = 1; - d->d_sock = s; - d->d_tran = tran; + d->d_url = url; + d->d_closed = false; + d->d_data = NULL; + d->d_ref = 1; + d->d_sock = s; + d->d_tran = tran; nni_atomic_flag_reset(&d->d_started); // Make a copy of the endpoint operations. This allows us to @@ -342,22 +346,6 @@ 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_id_remove(&dialers, d->d_id); - nni_mtx_unlock(&dialers_lk); - - nni_dialer_rele(d); -} - -void nni_dialer_close(nni_dialer *d) { nni_mtx_lock(&dialers_lk); @@ -389,8 +377,8 @@ static void dialer_connect_cb(void *arg) { nni_dialer *d = arg; - nni_aio * aio = &d->d_con_aio; - nni_aio * user_aio; + nni_aio *aio = &d->d_con_aio; + nni_aio *user_aio; int rv; nni_mtx_lock(&d->d_mtx); @@ -465,6 +453,14 @@ nni_dialer_start(nni_dialer *d, unsigned flags) return (rv); } +void +nni_dialer_stop(nni_dialer *d) +{ + nni_aio_stop(&d->d_tmo_aio); + nni_aio_stop(&d->d_con_aio); + d->d_ops.d_close(d->d_data); +} + nni_sock * nni_dialer_sock(nni_dialer *d) { |
