[core] Actor/ActorRef - ask calls to void methods
- allows to wait for execution of void methods as well as non-void methods
This commit is contained in:
committed by
Ivo van Dongen
parent
c17be060fd
commit
8b9794b1a7
@@ -64,6 +64,32 @@ public:
|
||||
std::promise<ResultType> promise;
|
||||
};
|
||||
|
||||
template <class Object, class MemberFn, class ArgsTuple>
|
||||
class AskMessageImpl<void, Object, MemberFn, ArgsTuple> : public Message {
|
||||
public:
|
||||
AskMessageImpl(std::promise<void> promise_, Object& object_, MemberFn memberFn_, ArgsTuple argsTuple_)
|
||||
: object(object_),
|
||||
memberFn(memberFn_),
|
||||
argsTuple(std::move(argsTuple_)),
|
||||
promise(std::move(promise_)) {
|
||||
}
|
||||
|
||||
void operator()() override {
|
||||
ask(std::make_index_sequence<std::tuple_size<ArgsTuple>::value>());
|
||||
promise.set_value();
|
||||
}
|
||||
|
||||
template <std::size_t... I>
|
||||
void ask(std::index_sequence<I...>) {
|
||||
(object.*memberFn)(std::move(std::get<I>(argsTuple))...);
|
||||
}
|
||||
|
||||
Object& object;
|
||||
MemberFn memberFn;
|
||||
ArgsTuple argsTuple;
|
||||
std::promise<void> promise;
|
||||
};
|
||||
|
||||
namespace actor {
|
||||
|
||||
template <class Object, class MemberFn, class... Args>
|
||||
|
||||
@@ -306,6 +306,28 @@ TEST(Actor, Ask) {
|
||||
ASSERT_EQ(2, result.get());
|
||||
}
|
||||
|
||||
TEST(Actor, AskVoid) {
|
||||
// Ask waits for void methods
|
||||
|
||||
struct Test {
|
||||
bool& executed;
|
||||
|
||||
Test(bool& executed_) : executed(executed_) {
|
||||
}
|
||||
|
||||
void doIt() {
|
||||
executed = true;
|
||||
}
|
||||
};
|
||||
|
||||
ThreadPool pool { 1 };
|
||||
bool executed = false;
|
||||
Actor<Test> actor(pool, executed);
|
||||
|
||||
actor.ask(&Test::doIt).get();
|
||||
EXPECT_TRUE(executed);
|
||||
}
|
||||
|
||||
TEST(Actor, NoSelfActorRef) {
|
||||
// Not all actors need a reference to self
|
||||
|
||||
|
||||
@@ -62,6 +62,28 @@ TEST(ActorRef, Ask) {
|
||||
EXPECT_EQ(30, ref.ask(&Test::echo, 30).get());
|
||||
}
|
||||
|
||||
TEST(ActorRef, AskVoid) {
|
||||
// Ask waits for void methods
|
||||
|
||||
struct Test {
|
||||
bool& executed;
|
||||
|
||||
Test(bool& executed_) : executed(executed_) {
|
||||
}
|
||||
|
||||
void doIt() {
|
||||
executed = true;
|
||||
}
|
||||
};
|
||||
|
||||
ThreadPool pool { 1 };
|
||||
bool executed = false;
|
||||
Actor<Test> actor(pool, executed);
|
||||
ActorRef<Test> ref = actor.self();
|
||||
|
||||
ref.ask(&Test::doIt).get();
|
||||
EXPECT_TRUE(executed);
|
||||
}
|
||||
|
||||
TEST(ActorRef, AskOnDestroyedActor) {
|
||||
// Tests behavior when calling ask() after the
|
||||
|
||||
Reference in New Issue
Block a user