diff options
Diffstat (limited to 'src/platform/posix/posix_ipcdial.c')
| -rw-r--r-- | src/platform/posix/posix_ipcdial.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/src/platform/posix/posix_ipcdial.c b/src/platform/posix/posix_ipcdial.c index 8f54f588..2b6d547a 100644 --- a/src/platform/posix/posix_ipcdial.c +++ b/src/platform/posix/posix_ipcdial.c @@ -167,9 +167,7 @@ ipc_dialer_dial(void *arg, nni_aio *aio) int fd; int rv; - if (nni_aio_begin(aio) != 0) { - return; - } + nni_aio_reset(aio); if (((len = nni_posix_nn2sockaddr(&ss, &d->sa)) == 0) || (ss.ss_family != AF_UNIX)) { @@ -182,23 +180,26 @@ ipc_dialer_dial(void *arg, nni_aio *aio) return; } - nni_refcnt_hold(&d->ref); - if ((rv = nni_posix_ipc_alloc(&c, &d->sa, d, fd)) != 0) { (void) close(fd); - nni_posix_ipc_dialer_rele(d); nni_aio_finish_error(aio, rv); return; } + // hold for the conn + nni_refcnt_hold(&d->ref); + nni_mtx_lock(&d->mtx); + if (!nni_aio_start(aio, ipc_dialer_cancel, d)) { + nni_mtx_unlock(&d->mtx); + nng_stream_free(&c->stream); + return; + } + if (d->closed) { rv = NNG_ECLOSED; goto error; } - if ((rv = nni_aio_schedule(aio, ipc_dialer_cancel, d)) != 0) { - goto error; - } c->dial_aio = aio; if (connect(fd, (void *) &ss, len) != 0) { if (errno != EINPROGRESS && errno != EAGAIN) { |
