mirror of
https://github.com/zeromq/libzmq.git
synced 2025-02-23 15:14:40 +01:00
Merge pull request #1409 from rikvdh/master
Fix another degradation, CPU maxes out when POLLOUT is set
This commit is contained in:
commit
a146503d30
@ -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 (
|
|||||||
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 (
|
|||||||
// 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 (
|
|||||||
// 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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user