[glibmm] Socket: Avoid creating a RefPtr to this.



commit c5c5f3e0d63e61bda7477ab75f2d29e81a66af1a
Author: Murray Cumming <murrayc murrayc com>
Date:   Wed Apr 5 12:16:39 2017 +0200

    Socket: Avoid creating a RefPtr to this.
    
    By adding a private SocketSource constructor (and create()), accessible
    via a friend declaration, that takes the raw GSocket.
    
    See https://bugzilla.gnome.org/show_bug.cgi?id=755037#c20

 gio/giomm/socketsource.cc |   16 ++++++++++++++++
 gio/giomm/socketsource.h  |   17 +++++++++++++++++
 gio/src/socket.ccg        |    5 +----
 3 files changed, 34 insertions(+), 4 deletions(-)
---
diff --git a/gio/giomm/socketsource.cc b/gio/giomm/socketsource.cc
index 4284261..a536322 100644
--- a/gio/giomm/socketsource.cc
+++ b/gio/giomm/socketsource.cc
@@ -92,6 +92,14 @@ SocketSource::create(const Glib::RefPtr<Socket>& socket, Glib::IOCondition condi
   return Glib::RefPtr<SocketSource>(new SocketSource(socket, condition, cancellable));
 }
 
+// static
+Glib::RefPtr<SocketSource>
+SocketSource::create(GSocket* socket, Glib::IOCondition condition,
+  const Glib::RefPtr<Cancellable>& cancellable)
+{
+  return Glib::RefPtr<SocketSource>(new SocketSource(socket, condition, cancellable));
+}
+
 SocketSource::SocketSource(const Glib::RefPtr<Socket>& socket, Glib::IOCondition condition,
   const Glib::RefPtr<Cancellable>& cancellable)
 : IOSource(
@@ -100,6 +108,14 @@ SocketSource::SocketSource(const Glib::RefPtr<Socket>& socket, Glib::IOCondition
 {
 }
 
+SocketSource::SocketSource(GSocket* socket, Glib::IOCondition condition,
+  const Glib::RefPtr<Cancellable>& cancellable)
+: IOSource(
+    g_socket_create_source(socket, (GIOCondition)condition, Glib::unwrap(cancellable)),
+    (GSourceFunc)&giomm_socketsource_callback)
+{
+}
+
 SocketSource::~SocketSource() noexcept
 {
 }
diff --git a/gio/giomm/socketsource.h b/gio/giomm/socketsource.h
index feadfb0..2b371c6 100644
--- a/gio/giomm/socketsource.h
+++ b/gio/giomm/socketsource.h
@@ -23,6 +23,10 @@
 #include <giomm/cancellable.h>
 #include <sigc++/sigc++.h>
 
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+using GSocket = struct _GSocket;
+#endif /* DOXYGEN_SHOULD_SKIP_THIS */
+
 namespace Gio
 {
 class Socket;
@@ -106,10 +110,23 @@ public:
     Glib::IOCondition condition,
     const Glib::RefPtr<Cancellable>& cancellable = Glib::RefPtr<Cancellable>());
 
+
 protected:
   SocketSource(const Glib::RefPtr<Socket>& socket, Glib::IOCondition condition,
     const Glib::RefPtr<Cancellable>& cancellable);
   ~SocketSource() noexcept override;
+
+private:
+  friend Socket;
+
+  // This is just to avoid the need for Gio::Socket to create a RefPtr<> to itself.
+  static Glib::RefPtr<SocketSource> create(GSocket* socket,
+    Glib::IOCondition condition,
+    const Glib::RefPtr<Cancellable>& cancellable = Glib::RefPtr<Cancellable>());
+
+  // This is just to avoid the need for Gio::Socket to create a RefPtr<> to itself.
+  SocketSource(GSocket* socket, Glib::IOCondition condition,
+    const Glib::RefPtr<Cancellable>& cancellable);
 };
 
 } // namespace Gio
diff --git a/gio/src/socket.ccg b/gio/src/socket.ccg
index 6dfd71e..7260dc9 100644
--- a/gio/src/socket.ccg
+++ b/gio/src/socket.ccg
@@ -114,10 +114,7 @@ Socket::send_with_blocking(
 Glib::RefPtr<SocketSource>
 Socket::create_source(Glib::IOCondition condition, const Glib::RefPtr<Cancellable>& cancellable)
 {
-  // The corresponding unreference() takes place in the dtor
-  // of the Glib::RefPtr<Socket> object below.
-  reference();
-  return SocketSource::create(Glib::RefPtr<Socket>(this), condition, cancellable);
+  return SocketSource::create(gobj(), condition, cancellable);
 }
 
 } // namespace Gio


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]