From 14a0e147b2b89fc7fed92c7d9c806b6c53380400 Mon Sep 17 00:00:00 2001 From: Pieter Hintjens Date: Sat, 12 Feb 2011 18:36:21 +0100 Subject: 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 --- src/ctx.cpp | 17 ----------------- src/zmq.cpp | 19 +++++++++++++++++++ 2 files changed, 19 insertions(+), 17 deletions(-) (limited to 'src') 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) -- cgit v1.2.3