diff options
| author | Garrett D'Amore <garrett@damore.org> | 2017-08-04 17:17:42 -0700 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2017-08-04 21:20:00 -0700 |
| commit | dc334d7193a2a0bc0194221b853a37e1be7f5b9a (patch) | |
| tree | 1eebf2773745a3a25e8a071fbe4f51cd5490d4e4 /src/platform/windows/win_resolv.c | |
| parent | 6887900ae033add30ee0151b72abe927c5239588 (diff) | |
| download | nng-dc334d7193a2a0bc0194221b853a37e1be7f5b9a.tar.gz nng-dc334d7193a2a0bc0194221b853a37e1be7f5b9a.tar.bz2 nng-dc334d7193a2a0bc0194221b853a37e1be7f5b9a.zip | |
Refactor AIO logic to close numerous races and reduce complexity.
This passes valgrind 100% clean for both helgrind and deep leak
checks. This represents a complete rethink of how the AIOs work,
and much simpler synchronization; the provider API is a bit simpler
to boot, as a number of failure modes have been simply eliminated.
While here a few other minor bugs were squashed.
Diffstat (limited to 'src/platform/windows/win_resolv.c')
| -rw-r--r-- | src/platform/windows/win_resolv.c | 28 |
1 files changed, 13 insertions, 15 deletions
diff --git a/src/platform/windows/win_resolv.c b/src/platform/windows/win_resolv.c index 44d00c34..a01dc123 100644 --- a/src/platform/windows/win_resolv.c +++ b/src/platform/windows/win_resolv.c @@ -30,13 +30,13 @@ static nni_mtx nni_win_resolv_mtx; typedef struct nni_win_resolv_item nni_win_resolv_item; struct nni_win_resolv_item { - int family; - int passive; - const char * name; - const char * serv; - int proto; - nni_aio * aio; - nni_taskq_ent tqe; + int family; + int passive; + const char *name; + const char *serv; + int proto; + nni_aio * aio; + nni_task task; }; static void @@ -50,7 +50,7 @@ nni_win_resolv_finish(nni_win_resolv_item *item, int rv) } static void -nni_win_resolv_cancel(nni_aio *aio) +nni_win_resolv_cancel(nni_aio *aio, int rv) { nni_win_resolv_item *item; @@ -61,8 +61,9 @@ nni_win_resolv_cancel(nni_aio *aio) } aio->a_prov_data = NULL; nni_mtx_unlock(&nni_win_resolv_mtx); - nni_taskq_cancel(nni_win_resolv_tq, &item->tqe); + nni_task_cancel(&item->task); NNI_FREE_STRUCT(item); + nni_aio_finish_error(aio, rv); } static int @@ -209,7 +210,8 @@ nni_win_resolv_ip(const char *host, const char *serv, int passive, int family, return; } - nni_taskq_ent_init(&item->tqe, nni_win_resolv_task, item); + nni_task_init( + nni_win_resolv_tq, &item->task, nni_win_resolv_task, item); switch (family) { case NNG_AF_INET: @@ -236,11 +238,7 @@ nni_win_resolv_ip(const char *host, const char *serv, int passive, int family, NNI_FREE_STRUCT(item); return; } - if ((rv = nni_taskq_dispatch(nni_win_resolv_tq, &item->tqe)) != 0) { - nni_win_resolv_finish(item, rv); - nni_mtx_unlock(&nni_win_resolv_mtx); - return; - } + nni_task_dispatch(&item->task); nni_mtx_unlock(&nni_win_resolv_mtx); } |
