Commit bd1c9fbf authored by neverlord's avatar neverlord

some tweaks

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