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.