Commit bd1c9fbf authored by neverlord's avatar neverlord

some tweaks

parent 74c35219
......@@ -59,21 +59,20 @@ class ThreadlessTestee(parent: Actor) extends Actor {
class AkkaTestee(parent: akka.actor.ActorRef) extends akka.actor.Actor {
def receive = {
case Spread(0) =>
parent ! Result(1)
self.stop
case Spread(s) =>
if (s > 0) {
val msg = Spread(s-1)
actorOf(new AkkaTestee(self)).start ! msg
actorOf(new AkkaTestee(self)).start ! msg
}
else {
parent ! Result(1)
self.stop
}
case Result(v1) =>
val msg = Spread(s-1)
actorOf(new AkkaTestee(self)).start ! msg
actorOf(new AkkaTestee(self)).start ! msg
become {
case Result(v2) =>
parent ! Result(v1 + v2)
self.exit
case Result(r1) =>
become {
case Result(r2) =>
parent ! Result(r1 + r2)
self.exit
}
}
}
}
......
......@@ -45,73 +45,67 @@ using namespace cppa;
struct testee : fsm_actor<testee>
{
actor_ptr m_parent;
actor_ptr parent;
behavior init_state;
testee(actor_ptr const& parent) : m_parent(parent)
testee(actor_ptr const& pptr) : parent(pptr)
{
init_state =
(
on<atom("spread"), int>() >> [=](int x)
on(atom("spread"), 0) >> [=]()
{
if (x > 0)
{
any_tuple msg = make_tuple(atom("spread"), x - 1);
spawn(new testee(this)) << msg;
spawn(new testee(this)) << msg;
become
(
on<atom("result"), uint32_t>() >> [=](uint32_t v1)
{
become
(
on<atom("result"), uint32_t>() >> [=](uint32_t v2)
{
send(m_parent, atom("result"), v1 + v2);
become_void();
}
);
}
);
}
else
{
send(m_parent, atom("result"), (std::uint32_t) 1);
become_void();
}
}
);
}
};
void stacked_actor(actor_ptr parent)
{
receive
(
on<atom("spread"), int>() >> [&](int x)
{
if (x > 0)
send(parent, atom("result"), (uint32_t) 1);
become_void();
},
on(atom("spread"), arg_match) >> [=](int x)
{
any_tuple msg = make_tuple(atom("spread"), x - 1);
spawn(stacked_actor, self) << msg;
spawn(stacked_actor, self) << msg;
receive
spawn(new testee(this)) << msg;
spawn(new testee(this)) << msg;
become
(
on<atom("result"), uint32_t>() >> [&](uint32_t v1)
on(atom("result"), arg_match) >> [=](uint32_t r1)
{
receive
become
(
on<atom("result"),uint32_t>() >> [&](uint32_t v2)
on(atom("result"), arg_match) >> [=](uint32_t r2)
{
send(parent, atom("result"), v1 + v2);
send(parent, atom("result"), r1 + r2);
become_void();
}
);
}
);
}
else
{
send(parent, atom("result"), (std::uint32_t) 1);
}
);
}
};
void stacked_testee(actor_ptr parent)
{
receive
(
on(atom("spread"), 0) >> [&]()
{
send(parent, atom("result"), (uint32_t) 1);
},
on(atom("spread"), arg_match) >> [&](int x)
{
any_tuple msg = make_tuple(atom("spread"), x-1);
spawn(stacked_testee, self) << msg;
spawn(stacked_testee, self) << msg;
receive
(
on(atom("result"), arg_match) >> [&](uint32_t v1)
{
receive
(
on(atom("result"),arg_match) >> [&](uint32_t v2)
{
send(parent, atom("result"), v1 + v2);
}
);
}
);
}
);
}
......@@ -147,7 +141,7 @@ int main(int argc, char** argv)
int num = rd<int>(argv[2]);
if (strcmp(argv[1], "stacked") == 0)
{
send(spawn(stacked_actor, self), atom("spread"), num);
send(spawn(stacked_testee, self), atom("spread"), num);
}
else if (strcmp(argv[1], "event-based") == 0)
{
......
......@@ -247,6 +247,12 @@ src/receive.cpp
benchmarks/actor_creation.cpp
benchmarks/mailbox_performance.cpp
benchmarks/mixed_case.cpp
benchmarks/actor_creation.erl
benchmarks/mailbox_performance.erl
benchmarks/mixed_case.erl
benchmarks/ActorCreation.scala
benchmarks/MailboxPerformance.scala
benchmarks/MixedCase.scala
cppa/util/default_deallocator.hpp
cppa/util/producer_consumer_list.hpp
cppa/util/arg_match_t.hpp
......@@ -28,28 +28,13 @@ using namespace cppa;
struct event_testee : public fsm_actor<event_testee>
{
behavior* w4str()
{
return &wait4string;
}
behavior* w4float()
{
return &wait4float;
}
behavior* w4int()
{
return &init_state;
}
behavior wait4string =
(
on<std::string>() >> [this]()
on<std::string>() >> [=]()
{
become(w4int());
become(&wait4int);
},
on<atom("GetState")>() >> [=]()
on<atom("get_state")>() >> [=]()
{
reply("wait4string");
}
......@@ -59,26 +44,28 @@ struct event_testee : public fsm_actor<event_testee>
(
on<float>() >> [=]()
{
become(w4str());
become(&wait4string);
},
on<atom("GetState")>() >> [=]()
on<atom("get_state")>() >> [=]()
{
reply("wait4float");
}
);
behavior init_state =
behavior wait4int =
(
on<int>() >> [=]()
{
become(w4float());
become(&wait4float);
},
on<atom("GetState")>() >> [=]()
on<atom("get_state")>() >> [=]()
{
reply("init_state");
reply("wait4int");
}
);
behavior& init_state = wait4int;
};
#else
......@@ -90,19 +77,21 @@ class event_testee : public fsm_actor<event_testee>
behavior wait4string;
behavior wait4float;
behavior init_state;
behavior wait4int;
behavior& init_state;
public:
event_testee()
event_testee() : init_state(wait4int)
{
wait4string =
(
on<std::string>() >> [=]()
{
become(&init_state);
become(&wait4int);
},
on<atom("GetState")>() >> [=]()
on<atom("get_state")>() >> [=]()
{
reply("wait4string");
}
......@@ -112,40 +101,24 @@ class event_testee : public fsm_actor<event_testee>
(
on<float>() >> [=]()
{
//become(&wait4string);
become
(
on<std::string>() >> [=]()
{
become(&init_state);
},
on<atom("GetState")>() >> []()
{
reply("wait4string");
}
);
become(&wait4string);
},
on<atom("GetState")>() >> [=]()
on<atom("get_state")>() >> [=]()
{
reply("wait4float");
}
);
init_state =
wait4int =
(
on<int>() >> [=]()
{
become(&wait4float);
},
on<atom("GetState")>() >> [=]()
on<atom("get_state")>() >> [=]()
{
reply("init_state");
},
after(std::chrono::seconds(5)) >> [=]()
{
quit(exit_reason::user_defined);
reply("wait4int");
}
);
}
......@@ -158,27 +131,21 @@ abstract_event_based_actor* event_testee2()
{
struct impl : fsm_actor<impl>
{
int num_timeouts;
timed_invoke_rules init_state;
impl() : num_timeouts(0)
behavior wait4timeout(int remaining)
{
init_state =
return
(
others() >> []()
{
cout << "event testee2: "
<< to_string(last_received())
<< endl;
},
after(std::chrono::milliseconds(50)) >> [=]()
{
if (++num_timeouts >= 5)
{
quit(exit_reason::normal);
}
if (remaining == 1) become_void();
else become(wait4timeout(remaining-1));
}
);
}
behavior init_state;
impl() : init_state(wait4timeout(5)) { }
};
return new impl;
}
......@@ -186,8 +153,6 @@ abstract_event_based_actor* event_testee2()
struct chopstick : public fsm_actor<chopstick>
{
behavior init_state;
behavior taken_by(actor_ptr hakker)
{
return
......@@ -207,17 +172,16 @@ struct chopstick : public fsm_actor<chopstick>
);
}
behavior init_state;
chopstick()
{
init_state =
(
on(atom("take"), arg_match) >> [=](actor_ptr hakker)
{
if (hakker)
{
become(taken_by(hakker));
reply(atom("taken"));
}
become(taken_by(hakker));
reply(atom("taken"));
},
on(atom("break")) >> [=]()
{
......@@ -237,34 +201,36 @@ class testee_actor : public scheduled_actor
void wait4string()
{
bool string_received = false;
receive_while([&]() { return !string_received; })
do_receive
(
on<std::string>() >> [&]()
{
string_received = true;
},
on<atom("GetState")>() >> [&]()
on<atom("get_state")>() >> [&]()
{
reply("wait4string");
}
);
)
.until([&]() { return string_received; });
}
void wait4float()
{
bool float_received = false;
receive_while([&]() { return !float_received; })
do_receive
(
on<float>() >> [&]()
{
float_received = true;
wait4string();
},
on<atom("GetState")>() >> [&]()
on<atom("get_state")>() >> [&]()
{
reply("wait4float");
}
);
)
.until([&]() { return float_received; });
}
public:
......@@ -277,9 +243,9 @@ class testee_actor : public scheduled_actor
{
wait4float();
},
on<atom("GetState")>() >> [&]()
on<atom("get_state")>() >> [&]()
{
reply("init_state");
reply("wait4int");
}
);
}
......@@ -346,10 +312,10 @@ std::string behavior_test()
send(et, .3f);
send(et, "hello again " + testee_name);
send(et, "goodbye " + testee_name);
send(et, atom("GetState"));
send(et, atom("get_state"));
receive
(
on<std::string>() >> [&](const std::string& str)
on_arg_match >> [&](const std::string& str)
{
result = str;
},
......@@ -383,8 +349,8 @@ size_t test__spawn()
await_all_others_done();
CPPA_CHECK_EQUAL(behavior_test<testee_actor>(), "init_state");
CPPA_CHECK_EQUAL(behavior_test<event_testee>(), "init_state");
CPPA_CHECK_EQUAL(behavior_test<testee_actor>(), "wait4int");
CPPA_CHECK_EQUAL(behavior_test<event_testee>(), "wait4int");
// create 20,000 actors linked to one single actor
// and kill them all through killing the link
......
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