diff options
| author | Garrett D'Amore <garrett@damore.org> | 2019-12-26 16:23:11 -0800 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2019-12-26 16:56:33 -0800 |
| commit | a31df988bb59e438e0eca9f7fb057a2c8ff7b54b (patch) | |
| tree | e5f7ba187069125e227235473da6290d234aeb43 /src/platform/posix/posix_ipcdial.c | |
| parent | d590eceab74772a8d5fa50c94074b09927577ee4 (diff) | |
| download | nng-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.c | 32 |
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; |
