Commit a146503d authored by Constantin Rack's avatar Constantin Rack

Merge pull request #1409 from rikvdh/master

Fix another degradation, CPU maxes out when POLLOUT is set
parents d8077bb3 aa2e74c2
...@@ -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