From 30cd655b3d6f0e159267595f0606421b8691c15c Mon Sep 17 00:00:00 2001 From: bjovke Date: Mon, 10 Apr 2017 14:10:47 +0200 Subject: [PATCH 1/3] Case found not covered in latest zmq::proxy() code. --- src/proxy.cpp | 58 ++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 44 insertions(+), 14 deletions(-) diff --git a/src/proxy.cpp b/src/proxy.cpp index 227a2970..5bac3ac6 100644 --- a/src/proxy.cpp +++ b/src/proxy.cpp @@ -66,6 +66,8 @@ delete poller_receive_blocked;\ delete poller_send_blocked;\ delete poller_both_blocked;\ + delete poller_frontend_only;\ + delete poller_backend_only\ #define CHECK_RC_EXIT_ON_FAILURE()\ @@ -173,14 +175,18 @@ int zmq::proxy ( // If frontend_==backend_ 'poller_send_blocked' and 'poller_receive_blocked' are the same, 'ZMQ_POLLIN' is ignored. // In that case 'poller_send_blocked' is not used. We need only 'poller_receive_blocked'. - // We also don't need 'poller_both_blocked', no need to initialize it. + // We also don't need 'poller_both_blocked', 'poller_backend_only' nor 'poller_frontend_only' no need to initialize it. // We save some RAM and time for initialization. zmq::socket_poller_t *poller_send_blocked = NULL; // All except 'ZMQ_POLLIN' on 'backend_'. zmq::socket_poller_t *poller_both_blocked = NULL; // All except 'ZMQ_POLLIN' on both 'frontend_' and 'backend_'. + zmq::socket_poller_t *poller_frontend_only = NULL; // Only 'ZMQ_POLLIN' and 'ZMQ_POLLOUT' on 'frontend_'. + zmq::socket_poller_t *poller_backend_only = NULL; // Only 'ZMQ_POLLIN' and 'ZMQ_POLLOUT' on 'backend_'. if (frontend_ != backend_) { poller_send_blocked = new (std::nothrow) zmq::socket_poller_t; // All except 'ZMQ_POLLIN' on 'backend_'. poller_both_blocked = new (std::nothrow) zmq::socket_poller_t; // All except 'ZMQ_POLLIN' on both 'frontend_' and 'backend_'. + poller_frontend_only = new (std::nothrow) zmq::socket_poller_t; // Only 'ZMQ_POLLIN' and 'ZMQ_POLLOUT' on 'frontend_'. + poller_backend_only = new (std::nothrow) zmq::socket_poller_t; // Only 'ZMQ_POLLIN' and 'ZMQ_POLLOUT' on 'backend_'. frontend_equal_to_backend = false; } else frontend_equal_to_backend = true; @@ -222,6 +228,10 @@ int zmq::proxy ( CHECK_RC_EXIT_ON_FAILURE (); rc = poller_receive_blocked->add (backend_, NULL, ZMQ_POLLIN | ZMQ_POLLOUT); // All except 'ZMQ_POLLIN' on 'frontend_'. CHECK_RC_EXIT_ON_FAILURE (); + rc = poller_frontend_only->add (frontend_, NULL, ZMQ_POLLIN | ZMQ_POLLOUT); + CHECK_RC_EXIT_ON_FAILURE (); + rc = poller_backend_only->add (backend_, NULL, ZMQ_POLLIN | ZMQ_POLLOUT); + CHECK_RC_EXIT_ON_FAILURE (); } // Register 'control_' with pollers. @@ -239,6 +249,10 @@ int zmq::proxy ( CHECK_RC_EXIT_ON_FAILURE (); rc = poller_both_blocked->add (control_, NULL, ZMQ_POLLIN); CHECK_RC_EXIT_ON_FAILURE (); + rc = poller_frontend_only->add (control_, NULL, ZMQ_POLLIN); + CHECK_RC_EXIT_ON_FAILURE (); + rc = poller_backend_only->add (control_, NULL, ZMQ_POLLIN); + CHECK_RC_EXIT_ON_FAILURE (); } } @@ -342,34 +356,50 @@ int zmq::proxy ( if (poller_wait == poller_both_blocked) poller_wait = poller_send_blocked; else - if (poller_wait == poller_receive_blocked) + if (poller_wait == poller_receive_blocked || poller_wait == poller_frontend_only) poller_wait = poller_in; } if (reply_processed) { // 'backend_' -> 'frontend_' if (poller_wait == poller_both_blocked) poller_wait = poller_receive_blocked; else - if (poller_wait == poller_send_blocked) + if (poller_wait == poller_send_blocked || poller_wait == poller_backend_only) poller_wait = poller_in; } } } else { - // No requests have been processed, there were no 'ZMQ_POLLOUT' events. - // That means that receiving end queue(s) is/are full. - // Disable receiving 'ZMQ_POLLIN' for sockets for which there's no 'ZMQ_POLLOUT'. + // No requests have been processed, there were no 'ZMQ_POLLIN' with corresponding 'ZMQ_POLLOUT' events. + // That means that out queue(s) is/are full or one out queue is full and second one has no messages to process. + // Disable receiving 'ZMQ_POLLIN' for sockets for which there's no 'ZMQ_POLLOUT', + // or wait only on both 'backend_''s or 'frontend_''s 'ZMQ_POLLIN' and 'ZMQ_POLLOUT'. if (frontend_in) { - if (poller_wait == poller_send_blocked) - poller_wait = poller_both_blocked; - else - poller_wait = poller_receive_blocked; + if (frontend_out) + // If frontend_in and frontend_out are true, obviously backend_in and backend_out are both false. + // In that case we need to wait for both 'ZMQ_POLLIN' and 'ZMQ_POLLOUT' only on 'backend_'. + // We'll never get here in case of frontend_==backend_ because then frontend_out will always be false. + poller_wait = poller_backend_only; + else { + if (poller_wait == poller_send_blocked) + poller_wait = poller_both_blocked; + else + if (poller_wait == poller_in) + poller_wait = poller_receive_blocked; + } } if (backend_in) { // Will never be reached if frontend_==backend_, 'backend_in' will // always be false due to design in 'for' event processing loop. - if (poller_wait == poller_receive_blocked) - poller_wait = poller_both_blocked; - else - poller_wait = poller_send_blocked; + if (backend_out) + // If backend_in and backend_out are true, obviously frontend_in and frontend_out are both false. + // In that case we need to wait for both 'ZMQ_POLLIN' and 'ZMQ_POLLOUT' only on 'frontend_'. + poller_wait = poller_frontend_only; + else { + if (poller_wait == poller_receive_blocked) + poller_wait = poller_both_blocked; + else + if (poller_wait == poller_in) + poller_wait = poller_send_blocked; + } } } From 2bdd06ca7e3034dfdc1a26e833aa5b99df10077c Mon Sep 17 00:00:00 2001 From: bjovke Date: Mon, 10 Apr 2017 14:36:30 +0200 Subject: [PATCH 2/3] Relicense file extensions corrected. --- RELICENSE/{JohanMabille => JohanMabille.md} | 0 RELICENSE/{StoianIvanov => StoianIvanov.md} | 0 RELICENSE/{eburkitt.txt => eburkitt.md} | 0 RELICENSE/{fidlej.txt => fidlej.md} | 0 RELICENSE/{michael-fox.txt => michael-fox.md} | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename RELICENSE/{JohanMabille => JohanMabille.md} (100%) rename RELICENSE/{StoianIvanov => StoianIvanov.md} (100%) rename RELICENSE/{eburkitt.txt => eburkitt.md} (100%) rename RELICENSE/{fidlej.txt => fidlej.md} (100%) rename RELICENSE/{michael-fox.txt => michael-fox.md} (100%) diff --git a/RELICENSE/JohanMabille b/RELICENSE/JohanMabille.md similarity index 100% rename from RELICENSE/JohanMabille rename to RELICENSE/JohanMabille.md diff --git a/RELICENSE/StoianIvanov b/RELICENSE/StoianIvanov.md similarity index 100% rename from RELICENSE/StoianIvanov rename to RELICENSE/StoianIvanov.md diff --git a/RELICENSE/eburkitt.txt b/RELICENSE/eburkitt.md similarity index 100% rename from RELICENSE/eburkitt.txt rename to RELICENSE/eburkitt.md diff --git a/RELICENSE/fidlej.txt b/RELICENSE/fidlej.md similarity index 100% rename from RELICENSE/fidlej.txt rename to RELICENSE/fidlej.md diff --git a/RELICENSE/michael-fox.txt b/RELICENSE/michael-fox.md similarity index 100% rename from RELICENSE/michael-fox.txt rename to RELICENSE/michael-fox.md From b6fb1f64a558a5e3cd3046374e8597352940f933 Mon Sep 17 00:00:00 2001 From: bjovke Date: Mon, 10 Apr 2017 15:39:20 +0200 Subject: [PATCH 3/3] Macro correction. --- src/proxy.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/proxy.cpp b/src/proxy.cpp index 5bac3ac6..f72fc74c 100644 --- a/src/proxy.cpp +++ b/src/proxy.cpp @@ -71,10 +71,12 @@ #define CHECK_RC_EXIT_ON_FAILURE()\ - if (rc < 0) {\ - PROXY_CLEANUP();\ - return close_and_return (&msg, -1);\ - } + do {\ + if (rc < 0) {\ + PROXY_CLEANUP();\ + return close_and_return (&msg, -1);\ + }\ + } while(0) #endif // ZMQ_HAVE_POLLER