Commit d79f2095 authored by Dominik Charousset's avatar Dominik Charousset

Bugfix in test multiplexer + easier usability

Fix a bug in the handling of receive policies and implicitly flush runnables
before reading data from the "virtual network buffer".
parent fd513a61
...@@ -243,7 +243,13 @@ void test_multiplexer::accept_connection(accept_handle hdl) { ...@@ -243,7 +243,13 @@ void test_multiplexer::accept_connection(accept_handle hdl) {
} }
void test_multiplexer::read_data(connection_handle hdl) { void test_multiplexer::read_data(connection_handle hdl) {
// flush any pending runnables
while (try_exec_runnable()) {
// nop
}
scribe_data& sd = scribe_data_[hdl]; scribe_data& sd = scribe_data_[hdl];
switch (sd.recv_conf.first) {
case receive_policy_flag::exactly:
while (sd.xbuf.size() >= sd.recv_conf.second) { while (sd.xbuf.size() >= sd.recv_conf.second) {
sd.rd_buf.clear(); sd.rd_buf.clear();
auto first = sd.xbuf.begin(); auto first = sd.xbuf.begin();
...@@ -252,6 +258,26 @@ void test_multiplexer::read_data(connection_handle hdl) { ...@@ -252,6 +258,26 @@ void test_multiplexer::read_data(connection_handle hdl) {
sd.xbuf.erase(first, last); sd.xbuf.erase(first, last);
sd.ptr->consume(sd.rd_buf.data(), sd.rd_buf.size()); sd.ptr->consume(sd.rd_buf.data(), sd.rd_buf.size());
} }
break;
case receive_policy_flag::at_least:
if (sd.xbuf.size() >= sd.recv_conf.second) {
sd.rd_buf.clear();
sd.rd_buf.swap(sd.xbuf);
sd.ptr->consume(sd.rd_buf.data(), sd.rd_buf.size());
}
break;
case receive_policy_flag::at_most:
auto max_bytes = static_cast<ptrdiff_t>(sd.recv_conf.second);
while (sd.xbuf.size() > 0) {
sd.rd_buf.clear();
auto first = sd.xbuf.begin();
auto last = (max_bytes < sd.xbuf.size()) ? first + max_bytes
: sd.xbuf.end();
sd.rd_buf.insert(sd.rd_buf.end(), first, last);
sd.xbuf.erase(first, last);
sd.ptr->consume(sd.rd_buf.data(), sd.rd_buf.size());
}
}
} }
void test_multiplexer::virtual_send(connection_handle hdl, void test_multiplexer::virtual_send(connection_handle hdl,
......
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