aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2020-12-05 16:30:20 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2020-12-05 16:30:20 +0000
commit37e31c53ee371db126c31a3e3fca8c1904a3fba7 (patch)
treea371e626900d8475fcc3f96ebf496fca6b3cd68d
parent807ff44ac51dae209de0cfe4c5a062f2e142b48b (diff)
Only handle wakeup if necessary.
-rw-r--r--fnet/src/vespa/fnet/transport_thread.cpp9
-rw-r--r--fnet/src/vespa/fnet/transport_thread.h4
-rw-r--r--vespalib/src/tests/net/selector/selector_test.cpp7
-rw-r--r--vespalib/src/vespa/vespalib/net/selector.h6
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;
}
};