Commit c0705e59 authored by Dominik Charousset's avatar Dominik Charousset

maintenance

parent 8f7a794d
......@@ -17,7 +17,7 @@ benchmarks/theron_actor_creation.cpp
benchmarks/theron_mailbox_performance.cpp
benchmarks/theron_mixed_case.cpp
benchmarks/utility.hpp
cppa/abstract_actor.hpp
cppa/detail/abstract_actor.hpp
cppa/event_based_actor.hpp
cppa/actor.hpp
cppa/actor_proxy.hpp
......
......@@ -32,7 +32,7 @@
#define CPPA_ACTOR_PROXY_HPP
#include "cppa/actor.hpp"
#include "cppa/abstract_actor.hpp"
#include "cppa/detail/abstract_actor.hpp"
namespace cppa {
......@@ -45,7 +45,7 @@ class actor_proxy : public actor { };
#else // CPPA_DOCUMENTATION
class actor_proxy : public abstract_actor<actor> {
class actor_proxy : public detail::abstract_actor<actor> {
typedef abstract_actor<actor> super;
......
......@@ -109,7 +109,7 @@ class context_switching_actor : public detail::abstract_scheduled_actor {
util::fiber m_fiber;
std::function<void()> m_behavior;
detail::receive_policy m_recv_policy;
std::unique_ptr<detail::behavior_stack> m_stack_ptr;
std::unique_ptr<detail::behavior_stack> m_bhvr_stack_ptr;
};
......
......@@ -51,9 +51,9 @@
#include "cppa/detail/recursive_queue_node.hpp"
#include "cppa/intrusive/single_reader_queue.hpp"
namespace cppa {
namespace cppa { class self_type; }
class self_type;
namespace cppa { namespace detail {
/**
* @brief Implements linking and monitoring for actors.
......@@ -273,6 +273,6 @@ class abstract_actor : public Base {
};
} // namespace cppa
} } // namespace cppa::detail
#endif // CPPA_ABSTRACT_ACTOR_HPP
......@@ -38,7 +38,7 @@
#include "cppa/any_tuple.hpp"
#include "cppa/scheduler.hpp"
#include "cppa/local_actor.hpp"
#include "cppa/abstract_actor.hpp"
#include "cppa/detail/abstract_actor.hpp"
#include "cppa/scheduled_actor.hpp"
#include "cppa/util/fiber.hpp"
......
......@@ -59,8 +59,15 @@ class event_based_actor : public detail::abstract_scheduled_actor {
public:
/**
* @brief Finishes execution with exit reason
* {@link exit_reason::unallowed_function_call unallowed_function_call}.
*/
void dequeue(behavior&); //override
/**
* @copydoc dequeue(behavior&)
*/
void dequeue(partial_function&); //override
resume_result resume(util::fiber*); //override
......@@ -70,8 +77,6 @@ class event_based_actor : public detail::abstract_scheduled_actor {
*/
virtual void init() = 0;
virtual void on_exit();
void quit(std::uint32_t reason = exit_reason::normal);
void unbecome();
......@@ -117,11 +122,13 @@ class event_based_actor : public detail::abstract_scheduled_actor {
receive(std::forward<Args>(args)...);
}
void do_become(behavior* bhvr, bool has_ownership, bool discard_old_bhvr);
private:
inline behavior& current_behavior() {
CPPA_REQUIRE(m_stack.empty() == false);
return m_stack.back();
CPPA_REQUIRE(m_bhvr_stack.empty() == false);
return m_bhvr_stack.back();
}
// required by detail::nestable_receive_policy
......@@ -130,17 +137,15 @@ class event_based_actor : public detail::abstract_scheduled_actor {
CPPA_REQUIRE(bhvr.timeout().valid());
m_has_pending_timeout_request = false;
bhvr.handle_timeout();
if (m_stack.empty() == false) {
if (m_bhvr_stack.empty() == false) {
request_timeout(current_behavior().timeout());
}
}
void do_become(behavior* bhvr, bool has_ownership, bool discard_old_bhvr);
// stack elements are moved to m_erased_stack_elements and erased later
// to prevent possible segfaults that can occur if a currently executed
// lambda gets deleted
detail::behavior_stack m_stack;
detail::behavior_stack m_bhvr_stack;
detail::receive_policy m_recv_policy;
};
......
......@@ -31,9 +31,6 @@
#ifndef CPPA_FSM_ACTOR_HPP
#define CPPA_FSM_ACTOR_HPP
#include <type_traits>
#include "cppa/util/rm_ref.hpp"
#include "cppa/event_based_actor.hpp"
namespace cppa {
......@@ -50,7 +47,7 @@ class fsm_actor : public event_based_actor {
public:
/**
* @brief Overrides abstract_event_based_actor::init() and sets
* @brief Overrides {@link event_based_actor::init()} and sets
* the initial actor behavior to <tt>Derived::init_state</tt>.
*/
void init() {
......
......@@ -53,14 +53,14 @@ namespace {
/**
* @brief Policy tag that causes {@link event_based_actor::become} to
* discard the current behavior.
* @relates event_based_actor
* @relates local_actor
*/
constexpr discard_behavior_t discard_behavior = discard_behavior_t();
/**
* @brief Policy tag that causes {@link event_based_actor::become} to
* keep the current behavior available.
* @relates event_based_actor
* @relates local_actor
*/
constexpr keep_behavior_t keep_behavior = keep_behavior_t();
......@@ -226,7 +226,7 @@ class local_actor : public actor {
*/
template<typename... Cases, typename... Args>
inline void become(discard_behavior_t, match_expr<Cases...>&& arg0, Args&&... args) {
become(discard_behavior, bhvr_collapse(std::move(arg0), std::forward<Args>(args)...));
become(discard_behavior, match_expr_concat(std::move(arg0), std::forward<Args>(args)...));
}
/**
......@@ -234,18 +234,12 @@ class local_actor : public actor {
*/
template<typename... Cases, typename... Args>
inline void become(keep_behavior_t, match_expr<Cases...>&& arg0, Args&&... args) {
become(keep_behavior, bhvr_collapse(std::move(arg0), std::forward<Args>(args)...));
become(keep_behavior, match_expr_concat(std::move(arg0), std::forward<Args>(args)...));
}
/**
* @brief Sets the actor's behavior. Equal to
* <tt>become(discard_old, arg0, args...)</tt>.
*/
template<typename Arg0, typename... Args>
void become(Arg0&& arg0, Args&&... args);
template<typename... Cases, typename... Args>
inline void become(match_expr<Cases...> arg0, Args&&... args) {
become(discard_behavior, bhvr_collapse(std::move(arg0), std::forward<Args>(args)...));
become(discard_behavior, match_expr_concat(std::move(arg0), std::forward<Args>(args)...));
}
/**
......
......@@ -47,7 +47,7 @@
#include "cppa/pattern.hpp"
#include "cppa/local_actor.hpp"
#include "cppa/exit_reason.hpp"
#include "cppa/abstract_actor.hpp"
#include "cppa/detail/abstract_actor.hpp"
#include "cppa/intrusive/singly_linked_list.hpp"
......@@ -67,11 +67,14 @@ class thread_mapped_actor : public local_actor { };
#else // CPPA_DOCUMENTATION
class thread_mapped_actor : public abstract_actor<local_actor> {
class self_type;
class thread_mapped_actor : public detail::abstract_actor<local_actor> {
friend class self_type;
friend class detail::receive_policy;
typedef abstract_actor<local_actor> super;
typedef detail::abstract_actor<local_actor> super;
public:
......@@ -96,7 +99,7 @@ class thread_mapped_actor : public abstract_actor<local_actor> {
private:
detail::receive_policy m_recv_policy;
std::unique_ptr<detail::behavior_stack> m_stack_ptr;
std::unique_ptr<detail::behavior_stack> m_bhvr_stack_ptr;
// required by nestable_receive_policy
static const detail::receive_policy_flag receive_flag = detail::rp_nestable;
......
......@@ -146,8 +146,8 @@ resume_result context_switching_actor::resume(util::fiber* from) {
}
void context_switching_actor::unbecome() {
if (m_stack_ptr) {
m_stack_ptr->pop_back();
if (m_bhvr_stack_ptr) {
m_bhvr_stack_ptr->pop_back();
}
else {
quit();
......@@ -155,13 +155,13 @@ void context_switching_actor::unbecome() {
}
void context_switching_actor::do_become(behavior* bhvr, bool ownership, bool discard) {
if (m_stack_ptr) {
if (discard) m_stack_ptr->pop_back();
m_stack_ptr->push_back(bhvr, ownership);
if (m_bhvr_stack_ptr) {
if (discard) m_bhvr_stack_ptr->pop_back();
m_bhvr_stack_ptr->push_back(bhvr, ownership);
}
else {
m_stack_ptr.reset(new detail::behavior_stack);
m_stack_ptr->exec();
m_bhvr_stack_ptr.reset(new detail::behavior_stack);
m_bhvr_stack_ptr->exec();
quit();
}
}
......
......@@ -51,7 +51,7 @@ void event_based_actor::dequeue(partial_function&) {
resume_result event_based_actor::resume(util::fiber*) {
auto done_cb = [&]() {
m_state.store(abstract_scheduled_actor::done);
m_stack.clear();
m_bhvr_stack.clear();
on_exit();
};
self.set(this);
......@@ -78,8 +78,8 @@ resume_result event_based_actor::resume(util::fiber*) {
if (m_recv_policy.invoke(this, e, current_behavior())) {
// try to match cached message before receiving new ones
do {
m_stack.cleanup();
if (m_stack.empty()) {
m_bhvr_stack.cleanup();
if (m_bhvr_stack.empty()) {
done_cb();
return resume_result::actor_done;
}
......@@ -103,15 +103,15 @@ void event_based_actor::do_become(behavior* bhvr,
bool discard_old_bhvr) {
reset_timeout();
request_timeout(bhvr->timeout());
if (discard_old_bhvr) m_stack.pop_back();
m_stack.push_back(bhvr, has_ownership);
if (discard_old_bhvr) m_bhvr_stack.pop_back();
m_bhvr_stack.push_back(bhvr, has_ownership);
}
void event_based_actor::quit(std::uint32_t reason) {
if (reason == exit_reason::normal) {
cleanup(exit_reason::normal);
m_stack.clear();
m_stack.cleanup();
m_bhvr_stack.clear();
m_bhvr_stack.cleanup();
}
else {
abstract_scheduled_actor::quit(reason);
......@@ -119,9 +119,7 @@ void event_based_actor::quit(std::uint32_t reason) {
}
void event_based_actor::unbecome() {
m_stack.pop_back();
m_bhvr_stack.pop_back();
}
void event_based_actor::on_exit() { }
} // namespace cppa
......@@ -97,7 +97,7 @@ class scheduler_helper {
};
void scheduler_helper::time_emitter(scheduler_helper::ptr_type m_self) {
typedef abstract_actor<local_actor> impl_type;
typedef detail::abstract_actor<local_actor> impl_type;
typedef std::unique_ptr<detail::recursive_queue_node> queue_node_ptr;
// setup & local variables
self.set(m_self.get());
......
......@@ -109,8 +109,8 @@ detail::filter_result thread_mapped_actor::filter_msg(const any_tuple& msg) {
}
void thread_mapped_actor::unbecome() {
if (m_stack_ptr) {
m_stack_ptr->pop_back();
if (m_bhvr_stack_ptr) {
m_bhvr_stack_ptr->pop_back();
}
else {
quit();
......@@ -118,13 +118,13 @@ void thread_mapped_actor::unbecome() {
}
void thread_mapped_actor::do_become(behavior* ptr, bool owns_ptr, bool discard){
if (m_stack_ptr) {
if (discard) m_stack_ptr->pop_back();
m_stack_ptr->push_back(ptr, owns_ptr);
if (m_bhvr_stack_ptr) {
if (discard) m_bhvr_stack_ptr->pop_back();
m_bhvr_stack_ptr->push_back(ptr, owns_ptr);
}
else {
m_stack_ptr.reset(new detail::behavior_stack);
m_stack_ptr->exec();
m_bhvr_stack_ptr.reset(new detail::behavior_stack);
m_bhvr_stack_ptr->exec();
quit();
}
}
......
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