From d4cc5923878aebeacdc9ed44142ac6707d3a9eeb Mon Sep 17 00:00:00 2001 From: Simon Giesecke Date: Mon, 23 Dec 2019 12:02:32 +0100 Subject: [PATCH] Problem: loop variable modified in loop step and body Solution: modify it in loop body only --- src/dist.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/dist.cpp b/src/dist.cpp index 1b5fa83e..346778bf 100644 --- a/src/dist.cpp +++ b/src/dist.cpp @@ -171,9 +171,13 @@ void zmq::dist_t::distribute (msg_t *msg_) } if (msg_->is_vsm ()) { - for (pipes_t::size_type i = 0; i < _matching; ++i) - if (!write (_pipes[i], msg_)) - --i; // Retry last write because index will have been swapped + for (pipes_t::size_type i = 0; i < _matching;) { + if (!write (_pipes[i], msg_)) { + // Use same index again because entry will have been removed. + } else { + ++i; + } + } int rc = msg_->close (); errno_assert (rc == 0); rc = msg_->init (); @@ -187,11 +191,14 @@ void zmq::dist_t::distribute (msg_t *msg_) // Push copy of the message to each matching pipe. int failed = 0; - for (pipes_t::size_type i = 0; i < _matching; ++i) + for (pipes_t::size_type i = 0; i < _matching;) { if (!write (_pipes[i], msg_)) { ++failed; - --i; // Retry last write because index will have been swapped + // Use same index again because entry will have been removed. + } else { + ++i; } + } if (unlikely (failed)) msg_->rm_refs (failed);