aboutsummaryrefslogtreecommitdiff
path: root/src/platform/posix/posix_ipcdial.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/platform/posix/posix_ipcdial.c')
-rw-r--r--src/platform/posix/posix_ipcdial.c32
1 files changed, 30 insertions, 2 deletions
diff --git a/src/platform/posix/posix_ipcdial.c b/src/platform/posix/posix_ipcdial.c
index 3ce8c401..50c7a897 100644
--- a/src/platform/posix/posix_ipcdial.c
+++ b/src/platform/posix/posix_ipcdial.c
@@ -50,12 +50,39 @@ ipc_dialer_close(void *arg)
}
static void
+ipc_dialer_fini(ipc_dialer *d)
+{
+ nni_mtx_fini(&d->mtx);
+ NNI_FREE_STRUCT(d);
+}
+
+static void
ipc_dialer_free(void *arg)
{
ipc_dialer *d = arg;
+
ipc_dialer_close(d);
- nni_mtx_fini(&d->mtx);
- NNI_FREE_STRUCT(d);
+ nni_mtx_lock(&d->mtx);
+ d->fini = true;
+ if (d->refcnt) {
+ nni_mtx_unlock(&d->mtx);
+ return;
+ }
+ nni_mtx_unlock(&d->mtx);
+ ipc_dialer_fini(d);
+}
+
+void
+nni_posix_ipc_dialer_rele(ipc_dialer *d)
+{
+ nni_mtx_lock(&d->mtx);
+ d->refcnt--;
+ if ((d->refcnt > 0) || (!d->fini)) {
+ nni_mtx_unlock(&d->mtx);
+ return;
+ }
+ nni_mtx_unlock(&d->mtx);
+ ipc_dialer_fini(d);
}
static void
@@ -174,6 +201,7 @@ ipc_dialer_dial(void *arg, nni_aio *aio)
nni_posix_pfd_set_cb(pfd, ipc_dialer_cb, c);
nni_mtx_lock(&d->mtx);
+ d->refcnt++;
if (d->closed) {
rv = NNG_ECLOSED;
goto error;