summaryrefslogtreecommitdiff
path: root/src/zmq.cpp
diff options
context:
space:
mode:
authorPieter Hintjens <ph@imatix.com>2011-02-12 18:36:21 +0100
committerMartin Sustrik <sustrik@250bpm.com>2011-02-12 18:36:21 +0100
commit14a0e147b2b89fc7fed92c7d9c806b6c53380400 (patch)
tree159cdaab82958a03a706e72846b3225f9747030e /src/zmq.cpp
parente94790006ea6f4c64cc1df1c193aa1cf89a75100 (diff)
Fixed win32 issue with WSAStartup
- ctx constructor was calling mailbox_t constructor implicitly - moved WSAStartup and WSACleanup to be outside constructor/destructor Signed-off-by: Pieter Hintjens <ph@imatix.com>
Diffstat (limited to 'src/zmq.cpp')
-rw-r--r--src/zmq.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/zmq.cpp b/src/zmq.cpp
index e0bcc6f..21377ef 100644
--- a/src/zmq.cpp
+++ b/src/zmq.cpp
@@ -234,6 +234,19 @@ void *zmq_init (int io_threads_)
}
#endif
+#ifdef ZMQ_HAVE_WINDOWS
+ // Intialise Windows sockets. Note that WSAStartup can be called multiple
+ // times given that WSACleanup will be called for each WSAStartup.
+ // We do this before the ctx constructor since its embedded mailbox_t
+ // object needs Winsock to be up and running.
+ WORD version_requested = MAKEWORD (2, 2);
+ WSADATA wsa_data;
+ int rc = WSAStartup (version_requested, &wsa_data);
+ zmq_assert (rc == 0);
+ zmq_assert (LOBYTE (wsa_data.wVersion) == 2 &&
+ HIBYTE (wsa_data.wVersion) == 2);
+#endif
+
// Create 0MQ context.
zmq::ctx_t *ctx = new (std::nothrow) zmq::ctx_t ((uint32_t) io_threads_);
zmq_assert (ctx);
@@ -250,6 +263,12 @@ int zmq_term (void *ctx_)
int rc = ((zmq::ctx_t*) ctx_)->terminate ();
int en = errno;
+#ifdef ZMQ_HAVE_WINDOWS
+ // On Windows, uninitialise socket layer.
+ rc = WSACleanup ();
+ wsa_assert (rc != SOCKET_ERROR);
+#endif
+
#if defined ZMQ_HAVE_OPENPGM
// Shut down the OpenPGM library.
if (pgm_shutdown () != TRUE)