diff options
author | Pieter Hintjens <ph@imatix.com> | 2011-02-12 18:36:21 +0100 |
---|---|---|
committer | Martin Sustrik <sustrik@250bpm.com> | 2011-02-12 18:36:21 +0100 |
commit | 14a0e147b2b89fc7fed92c7d9c806b6c53380400 (patch) | |
tree | 159cdaab82958a03a706e72846b3225f9747030e | |
parent | e94790006ea6f4c64cc1df1c193aa1cf89a75100 (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>
-rw-r--r-- | src/ctx.cpp | 17 | ||||
-rw-r--r-- | src/zmq.cpp | 19 |
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) |