diff options
Diffstat (limited to 'src/rep.cpp')
| -rw-r--r-- | src/rep.cpp | 52 | 
1 files changed, 15 insertions, 37 deletions
| diff --git a/src/rep.cpp b/src/rep.cpp index b987d9c..a5d1462 100644 --- a/src/rep.cpp +++ b/src/rep.cpp @@ -64,54 +64,32 @@ int zmq::rep_t::xrecv (msg_t *msg_, int flags_)          return -1;      } +    //  First thing to do when receiving a request is to copy all the labels +    //  to the reply pipe.      if (request_begins) { - -        //  Copy the backtrace stack to the reply pipe.          while (true) { - -            //  TODO: If request can be read but reply pipe is not -            //  ready for writing, we should drop the reply. - -            //  Get next part of the backtrace stack.              int rc = xrep_t::xrecv (msg_, flags_);              if (rc != 0)                  return rc; +            if (!(msg_->flags () & msg_t::label)) +                break; -            if (msg_->flags () & (msg_t::more | msg_t::label)) { - -                //  Empty message part delimits the traceback stack. -                bool bottom = (msg_->size () == 0); - -                //  Push it to the reply pipe. -                rc = xrep_t::xsend (msg_, flags_); -                zmq_assert (rc == 0); - -                //  The end of the traceback, move to processing message body. -                if (bottom) -                    break; -            } -            else { - -                //  If the traceback stack is malformed, discard anything -                //  already sent to pipe (we're at end of invalid message) -                //  and continue reading -- that'll switch us to the next pipe -                //  and next request. -                rc = xrep_t::rollback (); -                zmq_assert (rc == 0); -            } +            //  TODO: If the reply cannot be sent to the peer because +            //  od congestion, we should drop it. +            rc = xrep_t::xsend (msg_, flags_); +            zmq_assert (rc == 0);          } -          request_begins = false;      } - -    //  Now the routing info is safely stored. Get the first part -    //  of the message payload and exit. -    int rc = xrep_t::xrecv (msg_, flags_); -    if (rc != 0) -        return rc; +    else { +        int rc = xrep_t::xrecv (msg_, flags_); +        if (rc != 0) +            return rc; +    } +    zmq_assert (!(msg_->flags () & msg_t::label));      //  If whole request is read, flip the FSM to reply-sending state. -    if (!(msg_->flags () & (msg_t::more | msg_t::label))) { +    if (!(msg_->flags () & msg_t::more)) {          sending_reply = true;          request_begins = true;      } | 
