Commit 983d14f8 authored by Dominik Charousset's avatar Dominik Charousset

Add delayed_anon_send

parent 0ae125e9
......@@ -146,6 +146,25 @@ public:
rtime, this->ctrl(), actor_cast<strong_actor_ptr>(dest),
message_id::make(P), make_message(std::forward<Ts>(xs)...));
}
template <message_priority P = message_priority::normal,
class Source = actor, class Dest = actor, class... Ts>
void delayed_anon_send(const Dest& dest, const duration& rtime, Ts&&... xs) {
static_assert(sizeof...(Ts) > 0, "no message to send");
using token =
detail::type_list<
typename detail::implicit_conversions<
typename std::decay<Ts>::type
>::type...>;
static_assert(actor_accepts_message<
typename signatures_of<Dest>::type,
token
>::value,
"receiver does not accept given message");
this->system().scheduler().delayed_send(
rtime, nullptr, actor_cast<strong_actor_ptr>(dest),
message_id::make(P), make_message(std::forward<Ts>(xs)...));
}
};
} // namespace mixin
......
......@@ -31,18 +31,36 @@ using namespace caf;
namespace {
using ms = std::chrono::milliseconds;
using reset_atom = atom_constant<atom("reset")>;
using timer = typed_actor<reacts_to<reset_atom>>;
timer::behavior_type timer_impl(timer::pointer self) {
auto had_reset = std::make_shared<bool>(false);
self->delayed_send(self, std::chrono::milliseconds(100), reset_atom::value);
self->delayed_send(self, ms(100), reset_atom::value);
return {
[=](reset_atom) {
CAF_MESSAGE("timer reset");
*had_reset = true;
},
after(ms(600)) >> [=] {
CAF_MESSAGE("timer expired");
CAF_REQUIRE(*had_reset);
self->quit();
}
};
}
timer::behavior_type timer_impl2(timer::pointer self) {
auto had_reset = std::make_shared<bool>(false);
self->delayed_anon_send(self, ms(100), reset_atom::value);
return {
[=](reset_atom) {
CAF_MESSAGE("timer reset");
*had_reset = true;
},
after(std::chrono::milliseconds(600)) >> [=] {
after(ms(600)) >> [=] {
CAF_MESSAGE("timer expired");
CAF_REQUIRE(*had_reset);
self->quit();
......@@ -67,4 +85,8 @@ CAF_TEST(single_timeout) {
system.spawn(timer_impl);
}
CAF_TEST(single_anon_timeout) {
system.spawn(timer_impl2);
}
CAF_TEST_FIXTURE_SCOPE_END()
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