Commit 7aeaa35a authored by neverlord's avatar neverlord

bugfix

parent 2a2327f9
......@@ -61,16 +61,38 @@ class abstract_event_based_actor : public detail::abstract_scheduled_actor
struct stack_element
{
stack_element() = delete;
stack_element(const stack_element&) = delete;
stack_element& operator=(const stack_element&) = delete;
util::either<invoke_rules*, timed_invoke_rules*> m_ptr;
bool m_ownership;
inline stack_element(invoke_rules* ptr, bool take_ownership)
: m_ptr(ptr), m_ownership(take_ownership)
{
}
inline stack_element(timed_invoke_rules* ptr, bool take_ownership)
: m_ptr(ptr), m_ownership(take_ownership)
{
}
inline stack_element(stack_element&& other)
: m_ptr(other.m_ptr), m_ownership(other.m_ownership)
{
other.m_ownership = false;
}
inline stack_element& operator=(stack_element&& other)
{
m_ptr = other.m_ptr;
m_ownership = other.m_ownership;
other.m_ownership = false;
return *this;
}
inline ~stack_element()
{
if (m_ownership)
......@@ -95,11 +117,15 @@ class abstract_event_based_actor : public detail::abstract_scheduled_actor
}
inline invoke_rules& left()
{
return *(m_ptr.left());
auto ptr = m_ptr.left();
if (ptr == nullptr) throw std::runtime_error("nullptr");
return *(ptr);
}
inline timed_invoke_rules& right()
{
return *(m_ptr.right());
auto ptr = m_ptr.right();
if (ptr == nullptr) throw std::runtime_error("nullptr");
return *(ptr);
}
};
......
......@@ -3,6 +3,10 @@
#include "cppa/abstract_event_based_actor.hpp"
#include <iostream>
using std::cout;
using std::endl;
namespace cppa {
template<typename Derived>
......
......@@ -73,8 +73,6 @@ class invoke_rules_base
invoke_rules_base(invokable_list&& ilist);
invoke_rules_base(invoke_rules_base&& other);
protected:
invokable_list m_list;
......
......@@ -87,11 +87,11 @@ class either
{
if (other.m_is_left)
{
cr_left(other.left());
cr_left(other.m_left);
}
else
{
cr_right(other.right());
cr_right(other.m_right);
}
}
......@@ -99,11 +99,11 @@ class either
{
if (other.m_is_left)
{
cr_left(std::move(other.left()));
cr_left(std::move(other.m_left));
}
else
{
cr_right(std::move(other.right()));
cr_right(std::move(other.m_right));
}
}
......@@ -118,11 +118,11 @@ class either
{
if (m_is_left)
{
left() = other.left();
m_left = other.m_left;
}
else
{
right() = other.right();
m_right = other.m_right;
}
}
else
......@@ -131,11 +131,11 @@ class either
m_is_left = other.m_is_left;
if (other.m_is_left)
{
cr_left(other.left());
cr_left(other.m_left);
}
else
{
cr_right(other.right());
cr_right(other.m_right);
}
}
return *this;
......@@ -147,11 +147,11 @@ class either
{
if (m_is_left)
{
left() = std::move(other.left());
m_left = std::move(other.m_left);
}
else
{
right() = std::move(other.right());
m_right = std::move(other.m_right);
}
}
else
......@@ -160,11 +160,11 @@ class either
m_is_left = other.m_is_left;
if (other.m_is_left)
{
cr_left(std::move(other.left()));
cr_left(std::move(other.m_left));
}
else
{
cr_right(std::move(other.right()));
cr_right(std::move(other.m_right));
}
}
return *this;
......
......@@ -4,10 +4,10 @@
#include "cppa/detail/abstract_scheduled_actor.hpp"
#include "cppa/detail/yield_interface.hpp"
namespace { void dummy_enqueue(void*, cppa::detail::abstract_scheduled_actor*) { } }
namespace cppa { namespace detail {
namespace { void dummy_enqueue(void*, abstract_scheduled_actor*) { } }
abstract_scheduled_actor::abstract_scheduled_actor()
: next(nullptr)
, m_state(abstract_scheduled_actor::done)
......@@ -25,7 +25,6 @@ void abstract_scheduled_actor::quit(std::uint32_t reason)
{
cleanup(reason);
throw actor_exited(reason);
//yield(yield_state::done);
}
void abstract_scheduled_actor::enqueue_node(queue_node* node)
......@@ -70,7 +69,8 @@ void abstract_scheduled_actor::enqueue(actor* sender, const any_tuple& msg)
enqueue_node(new queue_node(sender, msg));
}
int abstract_scheduled_actor::compare_exchange_state(int expected, int new_value)
int abstract_scheduled_actor::compare_exchange_state(int expected,
int new_value)
{
int e = expected;
do
......@@ -90,7 +90,7 @@ void abstract_scheduled_actor::request_timeout(const util::duration& d)
m_has_pending_timeout_request = true;
}
abstract_scheduled_actor::filter_result abstract_scheduled_actor::filter_msg(const any_tuple& msg)
auto abstract_scheduled_actor::filter_msg(const any_tuple& msg) -> filter_result
{
if (m_pattern(msg))
{
......@@ -116,9 +116,9 @@ abstract_scheduled_actor::filter_result abstract_scheduled_actor::filter_msg(con
return ordinary_message;
}
abstract_scheduled_actor::dq_result abstract_scheduled_actor::dq(std::unique_ptr<queue_node>& node,
auto abstract_scheduled_actor::dq(std::unique_ptr<queue_node>& node,
invoke_rules_base& rules,
queue_node_buffer& buffer)
queue_node_buffer& buffer) -> dq_result
{
switch (filter_msg(node->msg))
{
......
......@@ -36,11 +36,6 @@ namespace cppa {
util::duration timed_invoke_rules::default_timeout;
// invoke_rules_base
invoke_rules_base::invoke_rules_base(invoke_rules_base&& other)
: m_list(std::move(other.m_list))
{
}
invoke_rules_base::invoke_rules_base(invokable_list&& ilist)
: m_list(std::move(ilist))
{
......@@ -78,7 +73,7 @@ timed_invoke_rules::timed_invoke_rules()
}
timed_invoke_rules::timed_invoke_rules(timed_invoke_rules&& other)
: super(std::move(other)), m_ti(std::move(other.m_ti))
: super(std::move(other.m_list)), m_ti(std::move(other.m_ti))
{
}
......@@ -119,7 +114,7 @@ invoke_rules::invoke_rules(invokable_list&& ll) : super(std::move(ll))
{
}
invoke_rules::invoke_rules(invoke_rules&& other) : super(std::move(other))
invoke_rules::invoke_rules(invoke_rules&& other) : super(std::move(other.m_list))
{
}
......
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