Commit 0d3c0567 authored by Dominik Charousset's avatar Dominik Charousset

maintenance

parent db48145f
......@@ -55,8 +55,8 @@ struct testee : sb_actor<testee> {
},
on<atom("spread"), int>() >> [=](int x) {
any_tuple msg = make_cow_tuple(atom("spread"), x - 1);
spawn(new testee(this)) << msg;
spawn(new testee(this)) << msg;
spawn<testee>(this) << msg;
spawn<testee>(this) << msg;
become (
on<atom("result"), uint32_t>() >> [=](uint32_t r1) {
become (
......@@ -107,7 +107,7 @@ int main(int argc, char** argv) {
send(spawn(stacked_testee, self), atom("spread"), num);
}
else if (strcmp(argv[1], "event-based") == 0) {
send(spawn(new testee(self)), atom("spread"), num);
send(spawn<testee>(self), atom("spread"), num);
}
else {
usage();
......
......@@ -189,7 +189,7 @@ struct server_actor : sb_actor<server_actor> {
},
on(atom("kickoff"), arg_match) >> [=](uint32_t num_pings) {
for (auto& kvp : m_pongs) {
auto ping = spawn(new ping_actor(last_sender()));
auto ping = spawn<ping_actor>(last_sender());
send(ping, atom("kickoff"), kvp.second, num_pings);
}
},
......@@ -241,7 +241,7 @@ void server_mode(Iterator first, Iterator last) {
};
match(std::vector<string>{first, last}) ( (on(kvp_port) || on("-p", _2i)) >> [](int port) {
if (port > 1024 && port < 65536) {
publish(spawn(new server_actor), port);
publish(spawn<server_actor>(), port);
}
else {
usage("illegal port: ", port);
......
......@@ -91,7 +91,7 @@ int main(int argc, char** argv) {
testee = spawn(receiver, num_sender * num_msgs);
}
else if (strcmp(argv[1], "event-based") == 0) {
testee = spawn(new fsm_receiver(num_sender * num_msgs));
testee = spawn<fsm_receiver>(num_sender * num_msgs);
}
else {
usage();
......
......@@ -101,14 +101,14 @@ struct fsm_chain_master : sb_actor<fsm_chain_master> {
send(worker, atom("calc"), s_task_n);
next = self;
for (int i = 1; i < ring_size; ++i) {
next = spawn(new fsm_chain_link(next));
next = spawn<fsm_chain_link>(next);
}
send(next, atom("token"), initial_token_value);
}
fsm_chain_master(actor_ptr msgcollector) : iteration(0), mc(msgcollector) {
init_state = (
on(atom("init"), arg_match) >> [=](int rs, int itv, int n) {
worker = spawn(new fsm_worker(msgcollector));
worker = spawn<fsm_worker>(msgcollector);
iteration = 0;
new_ring(rs, itv);
become (
......@@ -271,8 +271,8 @@ int main(int argc, char** argv) {
int repetitions) {
int num_msgs = num_rings + (num_rings * repetitions);
if (mode == "event-based") {
auto mc = spawn(new fsm_supervisor(num_msgs));
run_test([&]() { return spawn(new fsm_chain_master(mc)); },
auto mc = spawn<fsm_supervisor>(num_msgs);
run_test([&]() { return spawn<fsm_chain_master>(mc); },
num_rings, ring_size, initial_token_value, repetitions);
}
else if (mode == "stacked") {
......
......@@ -423,19 +423,9 @@ namespace cppa {
/**
* @ingroup ActorManagement
* @brief Spawns a new context-switching actor.
* @param impl Instance of an event-based actor.
* @returns An {@link actor_ptr} to the spawned {@link actor}.
*/
inline actor_ptr spawn(scheduled_actor* impl) {
return get_scheduler()->spawn(impl);
}
/**
* @ingroup ActorManagement
* @brief Spawns a new context-switching actor.
* @brief Spawns a new context-switching or thread-mapped {@link actor}.
* @tparam Hint A hint to the scheduler for the best scheduling strategy.
* @param bhvr A function implementing the actor's behavior.
* @param fun A function implementing the actor's behavior.
* @returns An {@link actor_ptr} to the spawned {@link actor}.
*/
template<scheduling_hint Hint>
......@@ -447,7 +437,7 @@ inline actor_ptr spawn(void_function fun) {
* @ingroup ActorManagement
* @brief Spawns a new context-switching actor,
* equal to <tt>spawn<detached>(bhvr)</tt>.
* @param bhvr A function implementing the actor's behavior.
* @param fun A function implementing the actor's behavior.
* @returns An {@link actor_ptr} to the spawned {@link actor}.
*/
inline actor_ptr spawn(void_function fun) {
......@@ -493,7 +483,7 @@ inline actor_ptr spawn(Fun fun, Arg0&& arg0, Args&&... args) {
* <tt>spawn<scheduled>(bhvr, arg0, args...)</tt>.
* @param bhvr A functor implementing the actor's behavior.
* @param arg0 First argument to @p bhvr.
* @param args Further argumetns to @p bhvr.
* @param args Further arguments to @p bhvr.
* @returns An {@link actor_ptr} to the spawned {@link actor}.
*/
template<typename Fun, typename Arg0, typename... Args>
......@@ -503,17 +493,30 @@ inline actor_ptr spawn(Fun&& fun, Arg0&& arg0, Args&&... args) {
std::forward<Args>(args)...);
}
/**
* @ingroup ActorManagement
* @brief Spawns a new actor of type @p ActorImpl.
* @tparam ActorImpl An event-based actor implementation.
* @param args Constructor arguments for @p ActorImpl.
* @returns An {@link actor_ptr} to the spawned {@link actor}.
*/
template<class ActorImpl, typename... Args>
inline actor_ptr spawn(Args&&... args) {
return spawn(new ActorImpl(std::forward<Args>(args)...));
}
inline actor_ptr spawn_in_group(const group_ptr& grp, event_based_actor* impl) {
return get_scheduler()->spawn(impl, [grp](local_actor* ptr) {
ptr->join(grp);
});
return get_scheduler()->spawn(new ActorImpl(std::forward<Args>(args)...));
}
/**
* @ingroup ActorManagement
* @brief Spawns a new context-switching or thread-mapped {@link actor}
* that joins @p grp immediately.
* @note The spawned actor joins @p grp after its
* {@link local_actor::init() init} member function is called but
* before it is executed. Hence, the spawned actor already joined
* the group before this function returns.
* @tparam Hint A hint to the scheduler for the best scheduling strategy.
* @param bhvr A function implementing the actor's behavior.
* @returns An {@link actor_ptr} to the spawned {@link actor}.
*/
template<scheduling_hint Hint>
inline actor_ptr spawn_in_group(const group_ptr& grp, void_function fun) {
return get_scheduler()->spawn(std::move(fun), Hint, [grp](local_actor* ptr){
......@@ -547,7 +550,8 @@ inline actor_ptr spawn_in_group(const group_ptr& grp,
template<class ActorImpl, typename... Args>
inline actor_ptr spawn_in_group(const group_ptr& grp, Args&&... args) {
return spawn_in_group(grp, new ActorImpl(std::forward<Args>(args)...));
return get_scheduler()->spawn(new ActorImpl(std::forward<Args>(args)...),
[&grp](local_actor* ptr) { ptr->join(grp); });
}
#ifdef CPPA_DOCUMENTATION
......
......@@ -50,17 +50,15 @@ class uniform_type_info_map {
public:
typedef std::set<std::string> string_set;
typedef std::map<std::string, uniform_type_info*> uti_map;
typedef std::map< int, std::pair<string_set, string_set> > int_map;
typedef std::set<std::string> set_type;
typedef std::map<std::string, uniform_type_info*> uti_map_type;
typedef std::map<int, std::pair<set_type, set_type> > int_map_type;
uniform_type_info_map();
~uniform_type_info_map();
inline const int_map& int_names() const {
inline const int_map_type& int_names() const {
return m_ints;
}
......@@ -76,13 +74,13 @@ class uniform_type_info_map {
private:
// maps raw typeid names to uniform type informations
uti_map m_by_rname;
uti_map_type m_by_rname;
// maps uniform names to uniform type informations
uti_map m_by_uname;
uti_map_type m_by_uname;
// maps sizeof(-integer_type-) to { signed-names-set, unsigned-names-set }
int_map m_ints;
int_map_type m_ints;
};
......
......@@ -175,7 +175,7 @@ int main(int, char**) {
cout << "chopstick ids:";
std::vector<actor_ptr> chopsticks;
for (size_t i = 0; i < 5; ++i) {
chopsticks.push_back(spawn(new chopstick));
chopsticks.push_back(spawn<chopstick>());
cout << " " << chopsticks.back()->id();
}
cout << endl;
......@@ -185,10 +185,10 @@ int main(int, char**) {
std::vector<std::string> names = { "Plato", "Hume", "Kant",
"Nietzsche", "Descartes" };
for (size_t i = 0; i < 5; ++i) {
spawn_in_group(dinner_club,
new philosopher(names[i],
spawn_in_group<philosopher>(dinner_club,
names[i],
chopsticks[i],
chopsticks[(i+1)%5]));
chopsticks[(i+1) % chopsticks.size()]);
}
// tell philosophers to start thinking
send(dinner_club, atom("think"));
......
......@@ -67,7 +67,7 @@ int main() {
// spawn a context-switching actor that invokes math_fun
auto a1 = spawn(math_fun);
// spawn an event-based math actor
auto a2 = spawn(new math_actor);
auto a2 = spawn<math_actor>();
// do some testing on both implementations
assert((fetch_result(a1, atom("plus"), 1, 2) == 3));
assert((fetch_result(a2, atom("plus"), 1, 2) == 3));
......
......@@ -739,7 +739,7 @@ bool uniform_type_info_map::insert(const std::set<std::string>& raw_names,
std::vector<const uniform_type_info*> uniform_type_info_map::get_all() const {
std::vector<const uniform_type_info*> result;
result.reserve(m_by_uname.size());
for (const uti_map::value_type& i : m_by_uname) {
for (const uti_map_type::value_type& i : m_by_uname) {
result.push_back(i.second);
}
return std::move(result);
......
......@@ -63,7 +63,7 @@ actor_ptr spawn_event_based_ping(size_t num_pings) {
);
}
};
return spawn(new impl{num_pings});
return spawn<impl>(num_pings);
}
void pong(actor_ptr ping_actor) {
......@@ -102,7 +102,7 @@ actor_ptr spawn_event_based_pong(actor_ptr ping_actor) {
);
}
};
auto pptr = spawn(new impl);
auto pptr = spawn<impl>();
// kickoff
ping_actor->enqueue(pptr.get(), make_any_tuple(atom("pong"), 0));
return pptr;
......
......@@ -137,7 +137,7 @@ class event_testee : public sb_actor<event_testee> {
#endif
// quits after 5 timeouts
event_based_actor* event_testee2() {
actor_ptr spawn_event_testee2() {
struct impl : sb_actor<impl> {
behavior wait4timeout(int remaining) {
return (
......@@ -152,7 +152,7 @@ event_based_actor* event_testee2() {
impl() : init_state(wait4timeout(5)) { }
};
return new impl;
return spawn<impl>();
}
struct chopstick : public sb_actor<chopstick> {
......@@ -458,7 +458,7 @@ size_t test__spawn() {
CPPA_IF_VERBOSE(cout << "ok" << endl);
CPPA_IF_VERBOSE(cout << "event_testee2 ... " << std::flush);
spawn(event_testee2());
spawn_event_testee2();
await_all_others_done();
CPPA_IF_VERBOSE(cout << "ok" << endl);
......
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