aboutsummaryrefslogtreecommitdiff
path: root/src/platform/windows
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2017-08-15 21:59:55 -0700
committerGarrett D'Amore <garrett@damore.org>2017-08-16 18:31:42 -0700
commita9633313ec8e578c805cd53b37ba3360d83157bc (patch)
tree14d32c4031ea1c8508a75469407ca77e353fa315 /src/platform/windows
parente7e2a6c14f0317eb77711951c6f1a650d4013dfe (diff)
downloadnng-a9633313ec8e578c805cd53b37ba3360d83157bc.tar.gz
nng-a9633313ec8e578c805cd53b37ba3360d83157bc.tar.bz2
nng-a9633313ec8e578c805cd53b37ba3360d83157bc.zip
Provide versions of mutex, condvar, and aio init that never fail.
If the underlying platform fails (FreeBSD is the only one I'm aware of that does this!), we use a global lock or condition variable instead. This means that our lock initializers never ever fail. Probably we could eliminate most of this for Linux and Darwin, since on those platforms, mutex and condvar initialization reasonably never fails. Initial benchmarks show little difference either way -- so we can revisit (optimize) later. This removes a lot of otherwise untested code in error cases and so forth, improving coverage and resilience in the face of allocation failures. Platforms other than POSIX should follow a similar pattern if they need this. (VxWorks, I'm thinking of you.) Most sane platforms won't have an issue here, since normally these initializations do not need to allocate memory. (Reportedly, even FreeBSD has plans to "fix" this in libthr2.) While here, some bugs were fixed in initialization & teardown. The fallback code is properly tested with dedicated test cases.
Diffstat (limited to 'src/platform/windows')
-rw-r--r--src/platform/windows/win_iocp.c13
-rw-r--r--src/platform/windows/win_ipc.c7
-rw-r--r--src/platform/windows/win_net.c2
-rw-r--r--src/platform/windows/win_pipe.c2
-rw-r--r--src/platform/windows/win_resolv.c5
-rw-r--r--src/platform/windows/win_thread.c6
6 files changed, 12 insertions, 23 deletions
diff --git a/src/platform/windows/win_iocp.c b/src/platform/windows/win_iocp.c
index c4cdcb8a..9c3343b7 100644
--- a/src/platform/windows/win_iocp.c
+++ b/src/platform/windows/win_iocp.c
@@ -174,17 +174,14 @@ nni_win_iocp_register(HANDLE h)
int
nni_win_event_init(nni_win_event *evt, nni_win_event_ops *ops, void *ptr)
{
- int rv;
-
ZeroMemory(&evt->olpd, sizeof(evt->olpd));
evt->olpd.hEvent = CreateEvent(NULL, TRUE, TRUE, NULL);
if (evt->olpd.hEvent == NULL) {
return (nni_win_error(GetLastError()));
}
- if (((rv = nni_mtx_init(&evt->mtx)) != 0) ||
- ((rv = nni_cv_init(&evt->cv, &evt->mtx)) != 0)) {
- return (rv); // NB: This will never happen on Windows.
- }
+ nni_mtx_init(&evt->mtx);
+ nni_cv_init(&evt->cv, &evt->mtx);
+
evt->ops = *ops;
evt->aio = NULL;
evt->ptr = ptr;
@@ -240,9 +237,7 @@ nni_win_iocp_sysinit(void)
goto fail;
}
}
- if ((rv = nni_mtx_init(&nni_win_iocp_mtx)) != 0) {
- goto fail;
- }
+ nni_mtx_init(&nni_win_iocp_mtx);
for (i = 0; i < NNI_WIN_IOCP_NTHREADS; i++) {
nni_thr_run(&nni_win_iocp_thrs[i]);
}
diff --git a/src/platform/windows/win_ipc.c b/src/platform/windows/win_ipc.c
index c9eb20ec..a60815fa 100644
--- a/src/platform/windows/win_ipc.c
+++ b/src/platform/windows/win_ipc.c
@@ -566,10 +566,9 @@ nni_win_ipc_sysinit(void)
NNI_LIST_INIT(&worker->workers, nni_plat_ipc_ep, node);
NNI_LIST_INIT(&worker->waiters, nni_plat_ipc_ep, node);
- if (((rv = nni_mtx_init(&worker->mtx)) != 0) ||
- ((rv = nni_cv_init(&worker->cv, &worker->mtx)) != 0)) {
- return (rv);
- }
+ nni_mtx_init(&worker->mtx);
+ nni_cv_init(&worker->cv, &worker->mtx);
+
rv = nni_thr_init(&worker->thr, nni_win_ipc_conn_thr, worker);
if (rv != 0) {
return (rv);
diff --git a/src/platform/windows/win_net.c b/src/platform/windows/win_net.c
index 63295a71..80e3724d 100644
--- a/src/platform/windows/win_net.c
+++ b/src/platform/windows/win_net.c
@@ -680,8 +680,6 @@ int
nni_win_tcp_sysinit(void)
{
WSADATA data;
- WORD ver;
- ver = MAKEWORD(2, 2);
if (WSAStartup(MAKEWORD(2, 2), &data) != 0) {
NNI_ASSERT(LOBYTE(data.wVersion) == 2);
NNI_ASSERT(HIBYTE(data.wVersion) == 2);
diff --git a/src/platform/windows/win_pipe.c b/src/platform/windows/win_pipe.c
index 861fbc76..edc4df3f 100644
--- a/src/platform/windows/win_pipe.c
+++ b/src/platform/windows/win_pipe.c
@@ -19,9 +19,9 @@
int
nni_plat_pipe_open(int *wfdp, int *rfdp)
{
- SOCKET afd = INVALID_SOCKET;
SOCKET rfd = INVALID_SOCKET;
SOCKET wfd = INVALID_SOCKET;
+ SOCKET afd;
struct sockaddr_in addr;
socklen_t alen;
diff --git a/src/platform/windows/win_resolv.c b/src/platform/windows/win_resolv.c
index a01dc123..4ce12d84 100644
--- a/src/platform/windows/win_resolv.c
+++ b/src/platform/windows/win_resolv.c
@@ -254,9 +254,8 @@ nni_win_resolv_sysinit(void)
{
int rv;
- if ((rv = nni_mtx_init(&nni_win_resolv_mtx)) != 0) {
- return (rv);
- }
+ nni_mtx_init(&nni_win_resolv_mtx);
+
if ((rv = nni_taskq_init(&nni_win_resolv_tq, 4)) != 0) {
nni_mtx_fini(&nni_win_resolv_mtx);
return (rv);
diff --git a/src/platform/windows/win_thread.c b/src/platform/windows/win_thread.c
index c01ec782..879cd772 100644
--- a/src/platform/windows/win_thread.c
+++ b/src/platform/windows/win_thread.c
@@ -30,12 +30,11 @@ nni_free(void *b, size_t z)
HeapFree(GetProcessHeap(), 0, b);
}
-int
+void
nni_plat_mtx_init(nni_plat_mtx *mtx)
{
InitializeSRWLock(&mtx->srl);
mtx->init = 1;
- return (0);
}
void
@@ -56,12 +55,11 @@ nni_plat_mtx_unlock(nni_plat_mtx *mtx)
ReleaseSRWLockExclusive(&mtx->srl);
}
-int
+void
nni_plat_cv_init(nni_plat_cv *cv, nni_plat_mtx *mtx)
{
InitializeConditionVariable(&cv->cv);
cv->srl = &mtx->srl;
- return (0);
}
void