Commit 3e04d670 authored by Dominik Charousset's avatar Dominik Charousset

provide new factory function make_counted

make_counted creates a new objects of type T and wraps it in an
intrusive_ptr, just like STL's make_shared is used to create a
shared_ptr
parent cc13bb2d
...@@ -197,6 +197,15 @@ inline bool operator!=(const intrusive_ptr<X>& lhs, const intrusive_ptr<Y>& rhs) ...@@ -197,6 +197,15 @@ inline bool operator!=(const intrusive_ptr<X>& lhs, const intrusive_ptr<Y>& rhs)
return !(lhs == rhs); return !(lhs == rhs);
} }
/**
* @brief Constructs an object of type T which must be a derived type
* of {@link ref_counted} and wraps it in an {@link intrusive_ptr}.
*/
template<typename T, typename... Args>
intrusive_ptr<T> make_counted(Args&&... args) {
return {new T(std::forward<Args>(args)...)};
}
} // namespace cppa } // namespace cppa
#endif // CPPA_INTRUSIVE_PTR_HPP #endif // CPPA_INTRUSIVE_PTR_HPP
...@@ -154,31 +154,11 @@ actor_ptr default_actor_addressing::get_or_put(const process_information& inf, ...@@ -154,31 +154,11 @@ actor_ptr default_actor_addressing::get_or_put(const process_information& inf,
actor_id aid) { actor_id aid) {
auto result = get(inf, aid); auto result = get(inf, aid);
if (result == nullptr) { if (result == nullptr) {
actor_proxy_ptr ptr(new default_actor_proxy(aid, new process_information(inf), m_parent)); auto ptr = make_counted<default_actor_proxy>(aid, new process_information(inf), m_parent);
put(inf, aid, ptr); put(inf, aid, ptr);
result = ptr; result = ptr;
} }
return result; return result;
/*
CPPA_LOG_TRACE("inf = " << to_string(inf) << ", aid = " << aid);
if (m_parent == nullptr) return get(inf, aid);
auto& submap = m_proxies[inf];
auto i = submap.find(aid);
if (i == submap.end()) {
actor_proxy_ptr result(new default_actor_proxy(aid, new process_information(inf), m_parent));
CPPA_LOG_DEBUG("created a new proxy instance: " << to_string(result.get()));
submap.insert(make_pair(aid, result));
auto p = m_parent->get_peer(inf);
CPPA_LOG_ERROR_IF(!p, "created a proxy for an unknown peer");
if (p) {
p->enqueue(addressed_message(nullptr, nullptr, make_any_tuple(atom("MONITOR"), process_information::get(), aid)));
}
return result;
}
auto result = i->second.promote();
CPPA_LOG_INFO_IF(!result, "proxy instance expired");
return result;
*/
} }
auto default_actor_addressing::proxies(process_information& i) -> proxy_map& { auto default_actor_addressing::proxies(process_information& i) -> proxy_map& {
......
...@@ -66,7 +66,7 @@ void default_protocol::publish(const actor_ptr& whom, variant_args args) { ...@@ -66,7 +66,7 @@ void default_protocol::publish(const actor_ptr& whom, variant_args args) {
CPPA_REQUIRE(args.size() == 2 || args.size() == 1); CPPA_REQUIRE(args.size() == 2 || args.size() == 1);
auto i = args.begin(); auto i = args.begin();
if (args.size() == 1) { if (args.size() == 1) {
auto port = get<uint16_t>(*i++); auto port = get<uint16_t>(*i);
publish(whom, ipv4_acceptor::create(port), {}); publish(whom, ipv4_acceptor::create(port), {});
} }
else if (args.size() == 2) { else if (args.size() == 2) {
...@@ -79,7 +79,7 @@ void default_protocol::publish(const actor_ptr& whom, variant_args args) { ...@@ -79,7 +79,7 @@ void default_protocol::publish(const actor_ptr& whom, variant_args args) {
void default_protocol::publish(const actor_ptr& whom, void default_protocol::publish(const actor_ptr& whom,
std::unique_ptr<acceptor> ptr, std::unique_ptr<acceptor> ptr,
variant_args args ) { variant_args args ) {
CPPA_LOG_TRACE(CPPA_TARG(whom, to_string) << ", " << CPPA_MARG(ptr, get) CPPA_LOG_TRACE(CPPA_TARG(whom, to_string) << ", " << CPPA_MARG(ptr, get)
<< ", args.size() = " << args.size()); << ", args.size() = " << args.size());
if (!whom) return; if (!whom) return;
...@@ -87,13 +87,11 @@ void default_protocol::publish(const actor_ptr& whom, ...@@ -87,13 +87,11 @@ void default_protocol::publish(const actor_ptr& whom,
static_cast<void>(args); // keep compiler happy static_cast<void>(args); // keep compiler happy
singleton_manager::get_actor_registry()->put(whom->id(), whom); singleton_manager::get_actor_registry()->put(whom->id(), whom);
default_protocol_ptr proto = this; default_protocol_ptr proto = this;
default_peer_acceptor_ptr impl(new default_peer_acceptor(this, auto impl = make_counted<default_peer_acceptor>(this, move(ptr), whom);
move(ptr),
whom));
run_later([=] { run_later([=] {
CPPA_LOGF_TRACE("lambda from default_protocol::publish"); CPPA_LOGF_TRACE("lambda from default_protocol::publish");
proto->continue_reader(impl.get());
proto->m_acceptors[whom].push_back(impl); proto->m_acceptors[whom].push_back(impl);
proto->continue_reader(impl.get());
}); });
} }
...@@ -161,7 +159,7 @@ actor_ptr default_protocol::remote_actor(io_stream_ptr_pair io, ...@@ -161,7 +159,7 @@ actor_ptr default_protocol::remote_actor(io_stream_ptr_pair io,
io.first->read(&remote_aid, sizeof(actor_id)); io.first->read(&remote_aid, sizeof(actor_id));
io.first->read(&peer_pid, sizeof(std::uint32_t)); io.first->read(&peer_pid, sizeof(std::uint32_t));
io.first->read(peer_node_id.data(), peer_node_id.size()); io.first->read(peer_node_id.data(), peer_node_id.size());
process_information_ptr pinfptr(new process_information(peer_pid, peer_node_id)); auto pinfptr = make_counted<process_information>(peer_pid, peer_node_id);
if (*pinf == *pinfptr) { if (*pinf == *pinfptr) {
// dude, this is not a remote actor, it's a local actor! // dude, this is not a remote actor, it's a local actor!
CPPA_LOG_ERROR("remote_actor() called to access a local actor"); CPPA_LOG_ERROR("remote_actor() called to access a local actor");
...@@ -205,7 +203,7 @@ void default_protocol::new_peer(const input_stream_ptr& in, ...@@ -205,7 +203,7 @@ void default_protocol::new_peer(const input_stream_ptr& in,
const output_stream_ptr& out, const output_stream_ptr& out,
const process_information_ptr& node) { const process_information_ptr& node) {
CPPA_LOG_TRACE(""); CPPA_LOG_TRACE("");
default_peer_ptr ptr(new default_peer(this, in, out, node)); auto ptr = make_counted<default_peer>(this, in, out, node);
continue_reader(ptr.get()); continue_reader(ptr.get());
if (node) register_peer(*node, ptr.get()); if (node) register_peer(*node, ptr.get());
} }
......
...@@ -278,7 +278,7 @@ class local_group_module : public group::module { ...@@ -278,7 +278,7 @@ class local_group_module : public group::module {
return i->second; return i->second;
} }
else { else {
local_group_ptr tmp(new local_group(true, this, identifier)); auto tmp = make_counted<local_group>(true, this, identifier);
{ // lifetime scope of uguard { // lifetime scope of uguard
upgrade_guard uguard(guard); upgrade_guard uguard(guard);
auto p = m_instances.insert(make_pair(identifier, tmp)); auto p = m_instances.insert(make_pair(identifier, tmp));
...@@ -440,7 +440,7 @@ class remote_group_module : public group::module { ...@@ -440,7 +440,7 @@ class remote_group_module : public group::module {
public: public:
remote_group_module() : super("remote") { remote_group_module() : super("remote") {
shared_map_ptr sm(new shared_map); auto sm = make_counted<shared_map>();
group::module_ptr _this = this; group::module_ptr _this = this;
m_map = sm; m_map = sm;
auto worker = spawn<detached_and_hidden>([_this, sm] { auto worker = spawn<detached_and_hidden>([_this, sm] {
...@@ -483,8 +483,7 @@ class remote_group_module : public group::module { ...@@ -483,8 +483,7 @@ class remote_group_module : public group::module {
on(atom("GROUP"), arg_match) >> [&](const group_ptr& g) { on(atom("GROUP"), arg_match) >> [&](const group_ptr& g) {
auto gg = dynamic_cast<local_group*>(g.get()); auto gg = dynamic_cast<local_group*>(g.get());
if (gg) { if (gg) {
remote_group_ptr rg; auto rg = make_counted<remote_group>(_this, key, gg);
rg.reset(new remote_group(_this, key, gg));
sm->put(key, rg); sm->put(key, rg);
peers[authority].second.push_back(make_pair(key, rg)); peers[authority].second.push_back(make_pair(key, rg));
} }
......
...@@ -136,8 +136,7 @@ std::unique_ptr<acceptor> ipv4_acceptor::create(std::uint16_t port, ...@@ -136,8 +136,7 @@ std::unique_ptr<acceptor> ipv4_acceptor::create(std::uint16_t port,
nonblocking(sockfd, true); nonblocking(sockfd, true);
// ok, no exceptions // ok, no exceptions
sguard.release(); sguard.release();
std::unique_ptr<ipv4_acceptor> result(new ipv4_acceptor(sockfd, true)); return std::unique_ptr<ipv4_acceptor>(new ipv4_acceptor(sockfd, true));
return std::move(result);
} }
ipv4_acceptor::~ipv4_acceptor() { ipv4_acceptor::~ipv4_acceptor() {
......
...@@ -555,7 +555,7 @@ void middleman_loop(middleman_impl* impl) { ...@@ -555,7 +555,7 @@ void middleman_loop(middleman_impl* impl) {
CPPA_LOGF_TRACE("run middleman loop, node: " CPPA_LOGF_TRACE("run middleman loop, node: "
<< to_string(*process_information::get())); << to_string(*process_information::get()));
handler->init(); handler->init();
impl->continue_reader(new middleman_overseer(impl->m_pipe_read, impl->m_queue)); impl->continue_reader(make_counted<middleman_overseer>(impl->m_pipe_read, impl->m_queue));
handler->update(); handler->update();
while (!impl->done()) { while (!impl->done()) {
auto iters = handler->poll(); auto iters = handler->poll();
......
...@@ -47,7 +47,7 @@ int main() { ...@@ -47,7 +47,7 @@ int main() {
CPPA_TEST(test__intrusive_ptr); CPPA_TEST(test__intrusive_ptr);
{ {
class0_ptr p(new class0); auto p = make_counted<class0>();
CPPA_CHECK_EQUAL(class0_instances, 1); CPPA_CHECK_EQUAL(class0_instances, 1);
CPPA_CHECK(p->unique()); CPPA_CHECK(p->unique());
} }
...@@ -77,11 +77,11 @@ int main() { ...@@ -77,11 +77,11 @@ int main() {
} }
CPPA_CHECK_EQUAL(class0_instances, 0); CPPA_CHECK_EQUAL(class0_instances, 0);
{ {
class0_ptr p1(new class0); auto p1 = make_counted<class0>();
p1 = new class1; p1 = new class1;
CPPA_CHECK_EQUAL(class0_instances, 1); CPPA_CHECK_EQUAL(class0_instances, 1);
CPPA_CHECK_EQUAL(class1_instances, 1); CPPA_CHECK_EQUAL(class1_instances, 1);
class1_ptr p2(new class1); auto p2 = make_counted<class1>();
p1 = p2; p1 = p2;
CPPA_CHECK_EQUAL(class0_instances, 1); CPPA_CHECK_EQUAL(class0_instances, 1);
CPPA_CHECK_EQUAL(class1_instances, 1); CPPA_CHECK_EQUAL(class1_instances, 1);
......
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