Mercurial > irccd
changeset 692:84c0b723100d
Irccd: store parent as weak_ptr, closes #799, @30m
author | David Demelier <markand@malikania.fr> |
---|---|
date | Tue, 17 Apr 2018 20:14:13 +0200 |
parents | c2626336a93e |
children | db9acd7993cd |
files | libirccd/irccd/daemon/service/transport_service.cpp libirccd/irccd/daemon/service/transport_service.hpp libirccd/irccd/daemon/transport_client.cpp libirccd/irccd/daemon/transport_client.hpp libirccd/irccd/daemon/transport_server.cpp libirccd/irccd/daemon/transport_server.hpp |
diffstat | 6 files changed, 10 insertions(+), 28 deletions(-) [+] |
line wrap: on
line diff
--- a/libirccd/irccd/daemon/service/transport_service.cpp Tue Apr 17 12:49:32 2018 +0200 +++ b/libirccd/irccd/daemon/service/transport_service.cpp Tue Apr 17 20:14:13 2018 +0200 @@ -108,7 +108,7 @@ transport_service::~transport_service() noexcept = default; -void transport_service::add(std::unique_ptr<transport_server> ts) +void transport_service::add(std::shared_ptr<transport_server> ts) { assert(ts);
--- a/libirccd/irccd/daemon/service/transport_service.hpp Tue Apr 17 12:49:32 2018 +0200 +++ b/libirccd/irccd/daemon/service/transport_service.hpp Tue Apr 17 20:14:13 2018 +0200 @@ -40,7 +40,7 @@ class transport_service { public: using commands_t = std::vector<std::unique_ptr<command>>; - using servers_t = std::vector<std::unique_ptr<transport_server>>; + using servers_t = std::vector<std::shared_ptr<transport_server>>; private: irccd& irccd_; @@ -89,7 +89,7 @@ * * \param ts the transport server */ - void add(std::unique_ptr<transport_server> ts); + void add(std::shared_ptr<transport_server> ts); /** * Send data to all clients.
--- a/libirccd/irccd/daemon/transport_client.cpp Tue Apr 17 12:49:32 2018 +0200 +++ b/libirccd/irccd/daemon/transport_client.cpp Tue Apr 17 20:14:13 2018 +0200 @@ -44,7 +44,9 @@ void transport_client::erase() { state_ = state_t::closing; - parent_.get_clients().erase(shared_from_this()); + + if (auto parent = parent_.lock()) + parent->get_clients().erase(shared_from_this()); } void transport_client::read(io::read_handler handler)
--- a/libirccd/irccd/daemon/transport_client.hpp Tue Apr 17 12:49:32 2018 +0200 +++ b/libirccd/irccd/daemon/transport_client.hpp Tue Apr 17 20:14:13 2018 +0200 @@ -47,7 +47,7 @@ private: state_t state_{state_t::authenticating}; - transport_server& parent_; + std::weak_ptr<transport_server> parent_; std::shared_ptr<io::stream> stream_; std::deque<std::pair<nlohmann::json, io::write_handler>> queue_; @@ -62,7 +62,7 @@ * \param server the parent * \param stream the I/O stream */ - inline transport_client(transport_server& server, std::shared_ptr<io::stream> stream) noexcept + inline transport_client(std::weak_ptr<transport_server> server, std::shared_ptr<io::stream> stream) noexcept : parent_(server) , stream_(std::move(stream)) { @@ -70,26 +70,6 @@ } /** - * Get the transport server parent. - * - * \return the parent - */ - inline const transport_server& get_parent() const noexcept - { - return parent_; - } - - /** - * Overloaded function. - * - * \return the parent - */ - inline transport_server& get_parent() noexcept - { - return parent_; - } - - /** * Get the current client state. * * \return the state
--- a/libirccd/irccd/daemon/transport_server.cpp Tue Apr 17 12:49:32 2018 +0200 +++ b/libirccd/irccd/daemon/transport_server.cpp Tue Apr 17 20:14:13 2018 +0200 @@ -103,7 +103,7 @@ } do_greetings( - std::make_shared<transport_client>(*this, std::move(stream)), + std::make_shared<transport_client>(shared_from_this(), std::move(stream)), std::move(handler) ); });
--- a/libirccd/irccd/daemon/transport_server.hpp Tue Apr 17 12:49:32 2018 +0200 +++ b/libirccd/irccd/daemon/transport_server.hpp Tue Apr 17 20:14:13 2018 +0200 @@ -127,7 +127,7 @@ * \see transport_client * \see transport_service */ -class transport_server { +class transport_server : public std::enable_shared_from_this<transport_server> { public: /** * Set of clients.