From aa2e74c2a268ba69680ccdf743f7538935a721a6 Mon Sep 17 00:00:00 2001 From: Rik van der Heijden Date: Wed, 27 May 2015 14:27:53 +0200 Subject: [PATCH] Fix another degradation, CPU maxes out when POLLOUT is set because poll exits on POLLOUT and doesn't wait for POLLIN. --- src/proxy.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/proxy.cpp b/src/proxy.cpp index 0db8fdc3..99dc3448 100644 --- a/src/proxy.cpp +++ b/src/proxy.cpp @@ -108,11 +108,15 @@ int zmq::proxy ( int more; size_t moresz; zmq_pollitem_t items [] = { - { frontend_, 0, ZMQ_POLLIN | ZMQ_POLLOUT, 0 }, - { backend_, 0, ZMQ_POLLIN | ZMQ_POLLOUT, 0 }, + { frontend_, 0, ZMQ_POLLIN, 0 }, + { backend_, 0, ZMQ_POLLIN, 0 }, { control_, 0, ZMQ_POLLIN, 0 } }; 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 enum { @@ -127,6 +131,12 @@ int zmq::proxy ( if (unlikely (rc < 0)) 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 if (control_ && items [2].revents & ZMQ_POLLIN) { rc = control_->recv (&msg, 0); @@ -160,7 +170,7 @@ int zmq::proxy ( // Process a request if (state == active && items [0].revents & ZMQ_POLLIN - && items [1].revents & ZMQ_POLLOUT) { + && itemsout [1].revents & ZMQ_POLLOUT) { rc = forward(frontend_, backend_, capture_,msg); if (unlikely (rc < 0)) return -1; @@ -168,7 +178,7 @@ int zmq::proxy ( // Process a reply if (state == active && items [1].revents & ZMQ_POLLIN - && items [0].revents & ZMQ_POLLOUT) { + && itemsout [0].revents & ZMQ_POLLOUT) { rc = forward(backend_, frontend_, capture_,msg); if (unlikely (rc < 0)) return -1;