[glibmm/refptr_as_sharedptr_v4: 1/8] Socket: Avoid creating a RefPtr to this.
- From: Murray Cumming <murrayc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glibmm/refptr_as_sharedptr_v4: 1/8] Socket: Avoid creating a RefPtr to this.
- Date: Wed, 5 Apr 2017 12:01:43 +0000 (UTC)
commit ca6c0366b215dcda4d25c53fbbaaa6cad850bdcf
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]