diff options
Diffstat (limited to 'src/socket_base.cpp')
| -rw-r--r-- | src/socket_base.cpp | 50 | 
1 files changed, 43 insertions, 7 deletions
| diff --git a/src/socket_base.cpp b/src/socket_base.cpp index 3b74359..b186683 100644 --- a/src/socket_base.cpp +++ b/src/socket_base.cpp @@ -37,6 +37,7 @@  #include "platform.hpp"  #include "pgm_sender.hpp"  #include "pgm_receiver.hpp" +#include "likely.hpp"  zmq::socket_base_t::socket_base_t (app_thread_t *parent_) :      object_t (parent_), @@ -58,6 +59,11 @@ zmq::socket_base_t::~socket_base_t ()  int zmq::socket_base_t::setsockopt (int option_, const void *optval_,      size_t optvallen_)  { +    if (unlikely (app_thread->is_terminated ())) { +        errno = ETERM; +        return -1; +    } +      //  First, check whether specific socket type overloads the option.      int rc = xsetsockopt (option_, optval_, optvallen_);      if (rc == 0 || errno != EINVAL) @@ -71,6 +77,11 @@ int zmq::socket_base_t::setsockopt (int option_, const void *optval_,  int zmq::socket_base_t::getsockopt (int option_, void *optval_,      size_t *optvallen_)  { +    if (unlikely (app_thread->is_terminated ())) { +        errno = ETERM; +        return -1; +    } +      if (option_ == ZMQ_RCVMORE) {          if (*optvallen_ < sizeof (int64_t)) {              errno = EINVAL; @@ -86,6 +97,11 @@ int zmq::socket_base_t::getsockopt (int option_, void *optval_,  int zmq::socket_base_t::bind (const char *addr_)  { +    if (unlikely (app_thread->is_terminated ())) { +        errno = ETERM; +        return -1; +    } +      //  Parse addr_ string.      std::string addr_type;      std::string addr_args; @@ -141,6 +157,11 @@ int zmq::socket_base_t::bind (const char *addr_)  int zmq::socket_base_t::connect (const char *addr_)  { +    if (unlikely (app_thread->is_terminated ())) { +        errno = ETERM; +        return -1; +    } +      //  Parse addr_ string.      std::string addr_type;      std::string addr_args; @@ -328,13 +349,16 @@ int zmq::socket_base_t::connect (const char *addr_)  int zmq::socket_base_t::send (::zmq_msg_t *msg_, int flags_)  { +    //  Process pending commands, if any. +    if (unlikely (!app_thread->process_commands (false, true))) { +        errno = ETERM; +        return -1; +    } +      //  At this point we impose the MORE flag on the message.      if (flags_ & ZMQ_SNDMORE)          msg_->flags |= ZMQ_MSG_MORE; -    //  Process pending commands, if any. -    app_thread->process_commands (false, true); -      //  Try to send the message.      int rc = xsend (msg_, flags_);      if (rc == 0) @@ -350,7 +374,10 @@ int zmq::socket_base_t::send (::zmq_msg_t *msg_, int flags_)      while (rc != 0) {          if (errno != EAGAIN)              return -1; -        app_thread->process_commands (true, false); +        if (unlikely (!app_thread->process_commands (true, false))) { +            errno = ETERM; +            return -1; +        }          rc = xsend (msg_, flags_);      }      return 0; @@ -371,7 +398,10 @@ int zmq::socket_base_t::recv (::zmq_msg_t *msg_, int flags_)      //  described above) from the one used by 'send'. This is because counting      //  ticks is more efficient than doing rdtsc all the time.      if (++ticks == inbound_poll_rate) { -        app_thread->process_commands (false, false); +        if (unlikely (!app_thread->process_commands (false, false))) { +            errno = ETERM; +            return -1; +        }          ticks = 0;      } @@ -392,7 +422,10 @@ int zmq::socket_base_t::recv (::zmq_msg_t *msg_, int flags_)      if (flags_ & ZMQ_NOBLOCK) {          if (errno != EAGAIN)              return -1; -        app_thread->process_commands (false, false); +        if (unlikely (!app_thread->process_commands (false, false))) { +            errno = ETERM; +            return -1; +        }          ticks = 0;          return xrecv (msg_, flags_);      } @@ -402,7 +435,10 @@ int zmq::socket_base_t::recv (::zmq_msg_t *msg_, int flags_)      while (rc != 0) {          if (errno != EAGAIN)              return -1; -        app_thread->process_commands (true, false); +        if (unlikely (!app_thread->process_commands (true, false))) { +            errno = ETERM; +            return -1; +        }          rc = xrecv (msg_, flags_);          ticks = 0;      } | 
