summaryrefslogtreecommitdiff
path: root/src
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
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')
-rw-r--r--src/ctx.cpp17
-rw-r--r--src/zmq.cpp19
2 files changed, 19 insertions, 17 deletions
diff --git a/src/ctx.cpp b/src/ctx.cpp
index 10c91c9..024e813 100644
--- a/src/ctx.cpp
+++ b/src/ctx.cpp
@@ -39,17 +39,6 @@ zmq::ctx_t::ctx_t (uint32_t io_threads_) :
{
int rc;
-#ifdef ZMQ_HAVE_WINDOWS
- // Intialise Windows sockets. Note that WSAStartup can be called multiple
- // times given that WSACleanup will be called for each WSAStartup.
- WORD version_requested = MAKEWORD (2, 2);
- WSADATA wsa_data;
- rc = WSAStartup (version_requested, &wsa_data);
- zmq_assert (rc == 0);
- zmq_assert (LOBYTE (wsa_data.wVersion) == 2 &&
- HIBYTE (wsa_data.wVersion) == 2);
-#endif
-
// Initialise the array of mailboxes. Additional three slots are for
// internal log socket and the zmq_term thread the reaper thread.
slot_count = max_sockets + io_threads_ + 3;
@@ -109,12 +98,6 @@ zmq::ctx_t::~ctx_t ()
// needed as mailboxes themselves were deallocated with their
// corresponding io_thread/socket objects.
free (slots);
-
-#ifdef ZMQ_HAVE_WINDOWS
- // On Windows, uninitialise socket layer.
- int rc = WSACleanup ();
- wsa_assert (rc != SOCKET_ERROR);
-#endif
}
int zmq::ctx_t::terminate ()
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)