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)
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
#endif // CPPA_INTRUSIVE_PTR_HPP
......@@ -154,31 +154,11 @@ actor_ptr default_actor_addressing::get_or_put(const process_information& inf,
actor_id aid) {
auto result = get(inf, aid);
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);
result = ptr;
}
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& {
......
......@@ -66,7 +66,7 @@ void default_protocol::publish(const actor_ptr& whom, variant_args args) {
CPPA_REQUIRE(args.size() == 2 || args.size() == 1);
auto i = args.begin();
if (args.size() == 1) {
auto port = get<uint16_t>(*i++);
auto port = get<uint16_t>(*i);
publish(whom, ipv4_acceptor::create(port), {});
}
else if (args.size() == 2) {
......@@ -79,7 +79,7 @@ void default_protocol::publish(const actor_ptr& whom, variant_args args) {
void default_protocol::publish(const actor_ptr& whom,
std::unique_ptr<acceptor> ptr,
variant_args args ) {
variant_args args ) {
CPPA_LOG_TRACE(CPPA_TARG(whom, to_string) << ", " << CPPA_MARG(ptr, get)
<< ", args.size() = " << args.size());
if (!whom) return;
......@@ -87,13 +87,11 @@ void default_protocol::publish(const actor_ptr& whom,
static_cast<void>(args); // keep compiler happy
singleton_manager::get_actor_registry()->put(whom->id(), whom);
default_protocol_ptr proto = this;
default_peer_acceptor_ptr impl(new default_peer_acceptor(this,
move(ptr),
whom));
auto impl = make_counted<default_peer_acceptor>(this, move(ptr), whom);
run_later([=] {
CPPA_LOGF_TRACE("lambda from default_protocol::publish");
proto->continue_reader(impl.get());
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,
io.first->read(&remote_aid, sizeof(actor_id));
io.first->read(&peer_pid, sizeof(std::uint32_t));
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) {
// dude, this is not a remote actor, it's 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,
const output_stream_ptr& out,
const process_information_ptr& node) {
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());
if (node) register_peer(*node, ptr.get());
}
......
......@@ -278,7 +278,7 @@ class local_group_module : public group::module {
return i->second;
}
else {
local_group_ptr tmp(new local_group(true, this, identifier));
auto tmp = make_counted<local_group>(true, this, identifier);
{ // lifetime scope of uguard
upgrade_guard uguard(guard);
auto p = m_instances.insert(make_pair(identifier, tmp));
......@@ -440,7 +440,7 @@ class remote_group_module : public group::module {
public:
remote_group_module() : super("remote") {
shared_map_ptr sm(new shared_map);
auto sm = make_counted<shared_map>();
group::module_ptr _this = this;
m_map = sm;
auto worker = spawn<detached_and_hidden>([_this, sm] {
......@@ -483,8 +483,7 @@ class remote_group_module : public group::module {
on(atom("GROUP"), arg_match) >> [&](const group_ptr& g) {
auto gg = dynamic_cast<local_group*>(g.get());
if (gg) {
remote_group_ptr rg;
rg.reset(new remote_group(_this, key, gg));
auto rg = make_counted<remote_group>(_this, key, gg);
sm->put(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,
nonblocking(sockfd, true);
// ok, no exceptions
sguard.release();
std::unique_ptr<ipv4_acceptor> result(new ipv4_acceptor(sockfd, true));
return std::move(result);
return std::unique_ptr<ipv4_acceptor>(new ipv4_acceptor(sockfd, true));
}
ipv4_acceptor::~ipv4_acceptor() {
......
......@@ -555,7 +555,7 @@ void middleman_loop(middleman_impl* impl) {
CPPA_LOGF_TRACE("run middleman loop, node: "
<< to_string(*process_information::get()));
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();
while (!impl->done()) {
auto iters = handler->poll();
......
......@@ -47,7 +47,7 @@ int main() {
CPPA_TEST(test__intrusive_ptr);
{
class0_ptr p(new class0);
auto p = make_counted<class0>();
CPPA_CHECK_EQUAL(class0_instances, 1);
CPPA_CHECK(p->unique());
}
......@@ -77,11 +77,11 @@ int main() {
}
CPPA_CHECK_EQUAL(class0_instances, 0);
{
class0_ptr p1(new class0);
auto p1 = make_counted<class0>();
p1 = new class1;
CPPA_CHECK_EQUAL(class0_instances, 1);
CPPA_CHECK_EQUAL(class1_instances, 1);
class1_ptr p2(new class1);
auto p2 = make_counted<class1>();
p1 = p2;
CPPA_CHECK_EQUAL(class0_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