aboutsummaryrefslogtreecommitdiff
path: root/src/platform/windows/win_resolv.c
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2017-08-04 17:17:42 -0700
committerGarrett D'Amore <garrett@damore.org>2017-08-04 21:20:00 -0700
commitdc334d7193a2a0bc0194221b853a37e1be7f5b9a (patch)
tree1eebf2773745a3a25e8a071fbe4f51cd5490d4e4 /src/platform/windows/win_resolv.c
parent6887900ae033add30ee0151b72abe927c5239588 (diff)
downloadnng-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.c28
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);
}