Commit 8852cf7c authored by Dominik Charousset's avatar Dominik Charousset

Use trivial match cases wherever possible

The advanced match cases are powerful, but slow down compilation and have
slightly higher runtime overhead than trivial match cases.
parent 5e12eb11
......@@ -127,6 +127,16 @@ using forward_atom = atom_constant<atom("FORWARD")>;
*/
using flush_atom = atom_constant<atom("FLUSH")>;
/**
* Generic 'LINK' atom for link requests over network.
*/
using link_atom = atom_constant<atom("LINK")>;
/**
* Generic 'UNLINK' atom for removing networked links.
*/
using unlink_atom = atom_constant<atom("UNLINK")>;
} // namespace caf
#endif // CAF_ATOM_HPP
......@@ -36,7 +36,7 @@ forwarding_actor_proxy::forwarding_actor_proxy(actor_id aid, node_id nid,
}
forwarding_actor_proxy::~forwarding_actor_proxy() {
anon_send(m_manager, make_message(atom("_DelProxy"), node(), id()));
anon_send(m_manager, make_message(delete_atom::value, node(), id()));
}
actor forwarding_actor_proxy::manager() const {
......@@ -60,7 +60,7 @@ void forwarding_actor_proxy::forward_msg(const actor_addr& sender,
<< CAF_TSARG(msg));
shared_lock<detail::shared_spinlock> m_guard(m_manager_mtx);
m_manager->enqueue(invalid_actor_addr, invalid_message_id,
make_message(atom("_Dispatch"), sender,
make_message(forward_atom::value, sender,
address(), mid, std::move(msg)),
nullptr);
}
......@@ -78,7 +78,7 @@ bool forwarding_actor_proxy::link_impl(linking_operation op,
// causes remote actor to link to (proxy of) other
// receiving peer will call: this->local_link_to(other)
forward_msg(address(), invalid_message_id,
make_message(atom("_Link"), other));
make_message(link_atom::value, other));
return true;
}
break;
......@@ -86,7 +86,7 @@ bool forwarding_actor_proxy::link_impl(linking_operation op,
if (remove_link_impl(other)) {
// causes remote actor to unlink from (proxy of) other
forward_msg(address(), invalid_message_id,
make_message(atom("_Unlink"), other));
make_message(unlink_atom::value, other));
return true;
}
break;
......@@ -94,7 +94,7 @@ bool forwarding_actor_proxy::link_impl(linking_operation op,
if (establish_backlink_impl(other)) {
// causes remote actor to unlink from (proxy of) other
forward_msg(address(), invalid_message_id,
make_message(atom("_Link"), other));
make_message(link_atom::value, other));
return true;
}
break;
......@@ -102,7 +102,7 @@ bool forwarding_actor_proxy::link_impl(linking_operation op,
if (remove_backlink_impl(other)) {
// causes remote actor to unlink from (proxy of) other
forward_msg(address(), invalid_message_id,
make_message(atom("_Unlink"), other));
make_message(unlink_atom::value, other));
return true;
}
break;
......
......@@ -80,7 +80,10 @@ behavior tester::make_behavior() {
monitor(m_aut);
send(m_aut, m_msg);
return {
on(1, 2, 3) >> [=] {
[=](int a, int b, int c) {
CAF_CHECK_EQUAL(a, 1);
CAF_CHECK_EQUAL(b, 2);
CAF_CHECK_EQUAL(c, 3);
CAF_CHECK(current_message().cvals()->get_reference_count() == 2
&& current_message().cvals().get() == m_msg.cvals().get());
},
......@@ -120,7 +123,10 @@ CAF_TEST(message_lifetime_in_scoped_actor) {
scoped_actor self;
self->send(self, msg);
self->receive(
on(1, 2, 3) >> [&] {
[&](int a, int b, int c) {
CAF_CHECK_EQUAL(a, 1);
CAF_CHECK_EQUAL(b, 2);
CAF_CHECK_EQUAL(c, 3);
CAF_CHECK_EQUAL(msg.cvals()->get_reference_count(), 2);
CAF_CHECK_EQUAL(self->current_message().cvals()->get_reference_count(), 2);
CAF_CHECK(self->current_message().cvals().get() == msg.cvals().get());
......
......@@ -26,27 +26,31 @@ using namespace caf;
namespace {
using a_atom = atom_constant<atom("a")>;
using b_atom = atom_constant<atom("b")>;
using c_atom = atom_constant<atom("c")>;
message_handler handle_a() {
return on("a") >> [] { return 1; };
return [](a_atom) { return 1; };
}
message_handler handle_b() {
return on("b") >> [] { return 2; };
return [](b_atom) { return 2; };
}
message_handler handle_c() {
return on("c") >> [] { return 3; };
return [](c_atom) { return 3; };
}
void run_testee(actor testee) {
scoped_actor self;
self->sync_send(testee, "a").await([](int i) {
self->sync_send(testee, a_atom::value).await([](int i) {
CAF_CHECK_EQUAL(i, 1);
});
self->sync_send(testee, "b").await([](int i) {
self->sync_send(testee, b_atom::value).await([](int i) {
CAF_CHECK_EQUAL(i, 2);
});
self->sync_send(testee, "c").await([](int i) {
self->sync_send(testee, c_atom::value).await([](int i) {
CAF_CHECK_EQUAL(i, 3);
});
self->send_exit(testee, exit_reason::user_shutdown);
......@@ -75,7 +79,7 @@ CAF_TEST(composition1) {
CAF_TEST(composition2) {
run_testee(
spawn([=] {
return handle_a().or_else(handle_b()).or_else(on("c") >> [] { return 3; });
return handle_a().or_else(handle_b()).or_else([](c_atom) { return 3; });
})
);
}
......@@ -83,7 +87,7 @@ CAF_TEST(composition2) {
CAF_TEST(composition3) {
run_testee(
spawn([=] {
return message_handler{on("a") >> [] { return 1; }}.
return message_handler{[](a_atom) { return 1; }}.
or_else(handle_b()).or_else(handle_c());
})
);
......
......@@ -217,7 +217,9 @@ class server : public event_based_actor {
forward_to(worker);
unbecome(); // await next idle message
},
on(idle_atom::value) >> skip_message,
[](idle_atom) {
return skip_message();
},
others >> [=] {
CAF_TEST_ERROR("Unexpected message: "
<< to_string(current_message()));
......@@ -225,7 +227,9 @@ class server : public event_based_actor {
}
);
},
on(request_atom::value) >> skip_message,
[](request_atom) {
return skip_message();
},
others >> [=] {
CAF_TEST_ERROR("Unexpected message: " << to_string(current_message()));
die();
......@@ -351,12 +355,6 @@ CAF_TEST(sync_send) {
CAF_MESSAGE("block on `await_all_other_actors_done");
self->await_all_other_actors_done();
CAF_MESSAGE("`await_all_other_actors_done` finished");
auto non_normal_down_msg = [](down_msg dm) -> optional<down_msg> {
if (dm.reason != exit_reason::normal) {
return dm;
}
return none;
};
auto await_ok_message = [&] {
self->receive(
[](ok_atom) {
......@@ -365,8 +363,12 @@ CAF_TEST(sync_send) {
[](error_atom) {
CAF_TEST_ERROR("A didn't receive sync response");
},
on(non_normal_down_msg) >> [&](const down_msg& dm) {
[&](const down_msg& dm) -> optional<skip_message_t> {
if (dm.reason == exit_reason::normal) {
return skip_message();
}
CAF_TEST_ERROR("A exited for reason " << dm.reason);
return none;
}
);
};
......
......@@ -152,10 +152,8 @@ behavior basp_broker::make_behavior() {
m_acceptors.erase(i);
},
// received from proxy instances
on(atom("_Dispatch"), arg_match) >> [=](const actor_addr& sender,
const actor_addr& receiver,
message_id mid,
const message& msg) {
[=](forward_atom, const actor_addr& sender, const actor_addr& receiver,
message_id mid, const message& msg) {
CAF_LOG_TRACE("");
if (dispatch(sender, receiver, mid, msg) == invalid_node_id
&& mid.is_request()) {
......@@ -163,7 +161,7 @@ behavior basp_broker::make_behavior() {
srb(sender, mid);
}
},
on(atom("_DelProxy"), arg_match) >> [=](const node_id& nid, actor_id aid) {
[=](delete_atom, const node_id& nid, actor_id aid) {
CAF_LOG_TRACE(CAF_TSARG(nid) << ", " << CAF_ARG(aid));
erase_proxy(nid, aid);
},
......@@ -302,11 +300,11 @@ void basp_broker::local_dispatch(const basp::header& hdr, message&& msg) {
bool is_unlink = true;
// extract arguments
msg.apply({
on(atom("_Link"), arg_match) >> [&](const actor_addr& addr) {
[&](link_atom, const actor_addr& addr) {
is_unlink = false;
other = addr;
},
on(atom("_Unlink"), arg_match) >> [&](const actor_addr& addr) {
[&](unlink_atom, const actor_addr& addr) {
other = addr;
}
});
......
......@@ -288,7 +288,7 @@ void broker::launch(execution_unit*, bool, bool is_hidden) {
CAF_LOGF_TRACE("init and launch broker with ID " << id());
// we want to make sure initialization is executed in MM context
become(
on(atom("INITMSG")) >> [=] {
[=](sys_atom) {
CAF_LOGF_TRACE("ID " << id());
unbecome();
// launch backends now, because user-defined initialization
......@@ -305,7 +305,7 @@ void broker::launch(execution_unit*, bool, bool is_hidden) {
}
);
enqueue(invalid_actor_addr, invalid_message_id,
make_message(atom("INITMSG")), nullptr);
make_message(sys_atom::value), nullptr);
}
void broker::configure_read(connection_handle hdl, receive_policy::config cfg) {
......
......@@ -30,8 +30,8 @@ namespace {
struct group_nameserver : event_based_actor {
behavior make_behavior() override {
return {
on(atom("GetGroup"), arg_match) >> [](const std::string& name) {
return make_message(atom("Group"), group::get("local", name));
[](get_atom, const std::string& name) {
return group::get("local", name);
}
};
}
......
......@@ -46,10 +46,10 @@ group remote_group(const std::string& group_identifier,
uint16_t port) {
auto group_server = remote_actor(host, port);
scoped_actor self;
self->send(group_server, atom("GetGroup"), group_identifier);
self->send(group_server, get_atom::value, group_identifier);
group result;
self->receive(
on(atom("Group"), arg_match) >> [&](group& grp) {
[&](group& grp) {
result = std::move(grp);
}
);
......
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