aboutsummaryrefslogtreecommitdiff
path: root/src/platform/posix/posix_ipcdial.c
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2019-12-26 16:23:11 -0800
committerGarrett D'Amore <garrett@damore.org>2019-12-26 16:56:33 -0800
commita31df988bb59e438e0eca9f7fb057a2c8ff7b54b (patch)
treee5f7ba187069125e227235473da6290d234aeb43 /src/platform/posix/posix_ipcdial.c
parentd590eceab74772a8d5fa50c94074b09927577ee4 (diff)
downloadnng-a31df988bb59e438e0eca9f7fb057a2c8ff7b54b.tar.gz
nng-a31df988bb59e438e0eca9f7fb057a2c8ff7b54b.tar.bz2
nng-a31df988bb59e438e0eca9f7fb057a2c8ff7b54b.zip
fixes #1037 http client crashes (pthread lock bugs)
This reference counts both TCP and IPC dialers running on POSIX configurations, as we need to take care not to destroy the dialer until any streams associated with are completely destroyed.
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;