Commit b7222548 authored by neverlord's avatar neverlord

cache nodes to reduce new/delete calls

parent 492f6535
...@@ -166,17 +166,46 @@ class abstract_actor : public Base ...@@ -166,17 +166,46 @@ class abstract_actor : public Base
protected: protected:
mailbox_type m_mailbox; mailbox_type m_mailbox;
util::fixed_vector<mailbox_element*, 10> m_nodes;
template<typename T> inline mailbox_element* fetch_node(actor* sender, any_tuple msg)
static inline mailbox_element* fetch_node(actor* sender, T&& msg)
{ {
return new mailbox_element(sender, std::forward<T>(msg)); if (m_nodes.empty())
{
return new mailbox_element(sender, std::move(msg));
}
else
{
auto result = m_nodes.back();
m_nodes.pop_back();
result->marked = false;
result->sender = sender;
result->msg = std::move(msg);
return result;
}
}
inline void release_node(mailbox_element* node)
{
if (m_nodes.full())
{
delete node;
}
else
{
m_nodes.push_back(node);
}
} }
template<typename... Args> template<typename... Args>
abstract_actor(Args&&... args) : Base(std::forward<Args>(args)...) abstract_actor(Args&&... args) : Base(std::forward<Args>(args)...)
, m_exit_reason(exit_reason::not_exited) , m_exit_reason(exit_reason::not_exited)
{ {
for (size_t i = 0; i < m_nodes.max_size(); ++i)
{
m_nodes.push_back(new mailbox_element);
}
} }
void cleanup(std::uint32_t reason) void cleanup(std::uint32_t reason)
......
...@@ -138,6 +138,7 @@ void abstract_event_based_actor::resume(util::fiber*, scheduler::callback* cb) ...@@ -138,6 +138,7 @@ void abstract_event_based_actor::resume(util::fiber*, scheduler::callback* cb)
{ {
case drop_msg: case drop_msg:
{ {
release_node(e.release());
break; // nop break; // nop
} }
case msg_handled: case msg_handled:
...@@ -155,11 +156,13 @@ void abstract_event_based_actor::resume(util::fiber*, scheduler::callback* cb) ...@@ -155,11 +156,13 @@ void abstract_event_based_actor::resume(util::fiber*, scheduler::callback* cb)
{ {
case drop_msg: case drop_msg:
{ {
release_node(i->release());
i = m_cache.erase(i); i = m_cache.erase(i);
break; break;
} }
case msg_handled: case msg_handled:
{ {
release_node(i->release());
m_cache.erase(i); m_cache.erase(i);
if (m_loop_stack.empty()) if (m_loop_stack.empty())
{ {
......
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