Commit aa2e74c2 authored by Rik van der Heijden's avatar Rik van der Heijden

Fix another degradation, CPU maxes out when POLLOUT is set because poll exits on…

Fix another degradation, CPU maxes out when POLLOUT is set because poll exits on POLLOUT and doesn't wait for POLLIN.
parent ae630cf3
...@@ -108,11 +108,15 @@ int zmq::proxy ( ...@@ -108,11 +108,15 @@ int zmq::proxy (
int more; int more;
size_t moresz; size_t moresz;
zmq_pollitem_t items [] = { zmq_pollitem_t items [] = {
{ frontend_, 0, ZMQ_POLLIN | ZMQ_POLLOUT, 0 }, { frontend_, 0, ZMQ_POLLIN, 0 },
{ backend_, 0, ZMQ_POLLIN | ZMQ_POLLOUT, 0 }, { backend_, 0, ZMQ_POLLIN, 0 },
{ control_, 0, ZMQ_POLLIN, 0 } { control_, 0, ZMQ_POLLIN, 0 }
}; };
int qt_poll_items = (control_ ? 3 : 2); int qt_poll_items = (control_ ? 3 : 2);
zmq_pollitem_t itemsout [] = {
{ frontend_, 0, ZMQ_POLLOUT, 0 },
{ backend_, 0, ZMQ_POLLOUT, 0 }
};
// Proxy can be in these three states // Proxy can be in these three states
enum { enum {
...@@ -127,6 +131,12 @@ int zmq::proxy ( ...@@ -127,6 +131,12 @@ int zmq::proxy (
if (unlikely (rc < 0)) if (unlikely (rc < 0))
return -1; return -1;
// Get the pollout separately because when combining this with pollin it maxes the CPU
// because pollout shall most of the time return directly
rc = zmq_poll (&itemsout [0], 2, 0);
if (unlikely (rc < 0))
return -1;
// Process a control command if any // Process a control command if any
if (control_ && items [2].revents & ZMQ_POLLIN) { if (control_ && items [2].revents & ZMQ_POLLIN) {
rc = control_->recv (&msg, 0); rc = control_->recv (&msg, 0);
...@@ -160,7 +170,7 @@ int zmq::proxy ( ...@@ -160,7 +170,7 @@ int zmq::proxy (
// Process a request // Process a request
if (state == active if (state == active
&& items [0].revents & ZMQ_POLLIN && items [0].revents & ZMQ_POLLIN
&& items [1].revents & ZMQ_POLLOUT) { && itemsout [1].revents & ZMQ_POLLOUT) {
rc = forward(frontend_, backend_, capture_,msg); rc = forward(frontend_, backend_, capture_,msg);
if (unlikely (rc < 0)) if (unlikely (rc < 0))
return -1; return -1;
...@@ -168,7 +178,7 @@ int zmq::proxy ( ...@@ -168,7 +178,7 @@ int zmq::proxy (
// Process a reply // Process a reply
if (state == active if (state == active
&& items [1].revents & ZMQ_POLLIN && items [1].revents & ZMQ_POLLIN
&& items [0].revents & ZMQ_POLLOUT) { && itemsout [0].revents & ZMQ_POLLOUT) {
rc = forward(backend_, frontend_, capture_,msg); rc = forward(backend_, frontend_, capture_,msg);
if (unlikely (rc < 0)) if (unlikely (rc < 0))
return -1; return -1;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment