diff options
author | Pieter Hintjens <ph@imatix.com> | 2012-03-22 11:03:32 -0500 |
---|---|---|
committer | Martin Sustrik <sustrik@250bpm.com> | 2012-03-24 09:20:00 +0100 |
commit | 153eaae2dbc816c4edee49666202b3d1172f0b34 (patch) | |
tree | c550527e0437fdad2d1443870dff933a5dec2e52 /src | |
parent | 5f9e3a26ee4ee894e39e8964efbd86bac87e2eec (diff) |
Fixed issue LIBZMQ-345 - race condition in ctx.socket/term allows segfault
Diffstat (limited to 'src')
-rw-r--r-- | src/ctx.cpp | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/src/ctx.cpp b/src/ctx.cpp index 6fb2b36..22c4908 100644 --- a/src/ctx.cpp +++ b/src/ctx.cpp @@ -83,11 +83,11 @@ xs::ctx_t::~ctx_t () int xs::ctx_t::terminate () { + slot_sync.lock (); if (!starting) { // Check whether termination was already underway, but interrupted and now // restarted. - slot_sync.lock (); bool restarted = terminating; terminating = true; slot_sync.unlock (); @@ -115,8 +115,8 @@ int xs::ctx_t::terminate () xs_assert (cmd.type == command_t::done); slot_sync.lock (); xs_assert (sockets.empty ()); - slot_sync.unlock (); } + slot_sync.unlock (); // Deallocate the resources. delete this; @@ -154,6 +154,7 @@ int xs::ctx_t::setctxopt (int option_, const void *optval_, size_t optvallen_) xs::socket_base_t *xs::ctx_t::create_socket (int type_) { + slot_sync.lock (); if (unlikely (starting)) { starting = false; @@ -194,8 +195,6 @@ xs::socket_base_t *xs::ctx_t::create_socket (int type_) } } - slot_sync.lock (); - // Once xs_term() was called, we can't create new sockets. if (terminating) { slot_sync.unlock (); |