diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2020-12-05 16:30:20 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2020-12-05 16:30:20 +0000 |
commit | 37e31c53ee371db126c31a3e3fca8c1904a3fba7 (patch) | |
tree | a371e626900d8475fcc3f96ebf496fca6b3cd68d | |
parent | 807ff44ac51dae209de0cfe4c5a062f2e142b48b (diff) |
Only handle wakeup if necessary.
-rw-r--r-- | fnet/src/vespa/fnet/transport_thread.cpp | 9 | ||||
-rw-r--r-- | fnet/src/vespa/fnet/transport_thread.h | 4 | ||||
-rw-r--r-- | vespalib/src/tests/net/selector/selector_test.cpp | 7 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/net/selector.h | 6 |
4 files changed, 17 insertions, 9 deletions
diff --git a/fnet/src/vespa/fnet/transport_thread.cpp b/fnet/src/vespa/fnet/transport_thread.cpp index 8c3783c74a4..5e1a9759a60 100644 --- a/fnet/src/vespa/fnet/transport_thread.cpp +++ b/fnet/src/vespa/fnet/transport_thread.cpp @@ -393,7 +393,7 @@ FNET_TransportThread::InitEventLoop() } void -FNET_TransportThread::handle_wakeup_events() +FNET_TransportThread::handle_wakeup() { { std::lock_guard<std::mutex> guard(_lock); @@ -473,10 +473,11 @@ FNET_TransportThread::EventLoopIteration() { _now = steady_clock::now(); // handle io-events - _selector.dispatch(*this); + auto dispatchResult = _selector.dispatch(*this); - // Must be called after selector.dispatch - handle_wakeup_events(); + if ((dispatchResult == vespalib::SelectorDispatchResult::NO_WAKEUP) && (getConfig()._events_before_wakeup > 1)) { + handle_wakeup(); + } // handle IOC time-outs if (getConfig()._iocTimeOut > vespalib::duration::zero()) { diff --git a/fnet/src/vespa/fnet/transport_thread.h b/fnet/src/vespa/fnet/transport_thread.h index 36490c88656..517c0239887 100644 --- a/fnet/src/vespa/fnet/transport_thread.h +++ b/fnet/src/vespa/fnet/transport_thread.h @@ -172,8 +172,6 @@ private: return _shutdown.load(std::memory_order_relaxed); } - void handle_wakeup_events(); - public: FNET_TransportThread(const FNET_TransportThread &) = delete; FNET_TransportThread &operator=(const FNET_TransportThread &) = delete; @@ -405,7 +403,7 @@ public: // Empty selector call-back for selector wakeup - void handle_wakeup() { } + void handle_wakeup(); // selector call-back for io-events void handle_event(FNET_IOComponent &ctx, bool read, bool write); diff --git a/vespalib/src/tests/net/selector/selector_test.cpp b/vespalib/src/tests/net/selector/selector_test.cpp index 7d7a147bcb2..5c91dfdc122 100644 --- a/vespalib/src/tests/net/selector/selector_test.cpp +++ b/vespalib/src/tests/net/selector/selector_test.cpp @@ -77,7 +77,12 @@ struct Fixture { } Fixture &poll(int timeout_ms = 60000) { selector.poll(timeout_ms); - selector.dispatch(*this); + auto dispatchResult = selector.dispatch(*this); + if (wakeup) { + EXPECT_TRUE(dispatchResult == SelectorDispatchResult::WAKEUP_CALLED); + } else { + EXPECT_TRUE(dispatchResult == SelectorDispatchResult::NO_WAKEUP); + } return *this; } void verify(bool expect_wakeup, std::vector<std::pair<bool,bool> > expect_events) { diff --git a/vespalib/src/vespa/vespalib/net/selector.h b/vespalib/src/vespa/vespalib/net/selector.h index 6b1967ddcd9..24b3abc806e 100644 --- a/vespalib/src/vespa/vespalib/net/selector.h +++ b/vespalib/src/vespa/vespalib/net/selector.h @@ -31,6 +31,7 @@ public: }; //----------------------------------------------------------------------------- +enum class SelectorDispatchResult {WAKEUP_CALLED, NO_WAKEUP}; template <typename Context> class Selector @@ -55,11 +56,13 @@ public: void poll(int timeout_ms) { _events.extract(_epoll, timeout_ms); } size_t num_events() const { return _events.size(); } template <typename Handler> - void dispatch(Handler &handler) { + SelectorDispatchResult dispatch(Handler &handler) { + SelectorDispatchResult result = SelectorDispatchResult::NO_WAKEUP; for (const auto &evt: _events) { if (evt.data.ptr == nullptr) { _wakeup_pipe.read_tokens(); handler.handle_wakeup(); + result = SelectorDispatchResult::WAKEUP_CALLED; } else { Context &ctx = *((Context *)(evt.data.ptr)); bool read = ((evt.events & (EPOLLIN | EPOLLERR | EPOLLHUP)) != 0); @@ -67,6 +70,7 @@ public: handler.handle_event(ctx, read, write); } } + return result; } }; |