summaryrefslogtreecommitdiff
path: root/gio/src/dbusobjectmanagerclient.ccg
diff options
context:
space:
mode:
authorKjell Ahlstedt <kjellahlstedt@gmail.com>2023-03-27 15:20:04 +0200
committerKjell Ahlstedt <kjellahlstedt@gmail.com>2023-03-27 15:20:04 +0200
commitb7ad9b86d70003c065606c563578cc66dcd2ce0a (patch)
tree264e2c4723ba49647707a71b04c778f2e5b30124 /gio/src/dbusobjectmanagerclient.ccg
parentd3874b1ec56d6db6b393e94daa1aded0f94d4b8b (diff)
downloadglibmm-b7ad9b86d70003c065606c563578cc66dcd2ce0a.tar.gz
Gio: Use callback functions with C linkage
* gio/giomm/socketsource.cc: Add extern "C". * gio/src/application.[ccg|hg]: Call Application_Class::open_callback() via a local function with C linkage. * gio/src/asyncinitable.[ccg|hg]: Call AsyncInitable_Class::init_async_vfunc_callback() and init_finish_vfunc_callback() via local functions with C linkage. * gio/src/dbusobjectmanagerclient.ccg: Use a local function with C linkage instead of Glib::destroy_notify_delete<SlotProxyType>. * gio/src/file.ccg: Add extern "C". * gio/src/liststore.ccg: Add a TODO comment. * gio/src/memoryinputstream.ccg: Add extern "C". * gio/src/settings.ccg: Add extern "C". * gio/src/socketcontrolmessage.[ccg|hg]: Call SocketControlMessage_Class::deserialize_async_vfunc_callback() via a local function with C linkage. Code that mixes up C linkage and C++ linkage has undefined behavior. Most compilers make no difference between C and C++ linkage, so it has not been an issue so far. Part of issue #1
Diffstat (limited to 'gio/src/dbusobjectmanagerclient.ccg')
-rw-r--r--gio/src/dbusobjectmanagerclient.ccg13
1 files changed, 10 insertions, 3 deletions
diff --git a/gio/src/dbusobjectmanagerclient.ccg b/gio/src/dbusobjectmanagerclient.ccg
index 76cc808e..5450ac09 100644
--- a/gio/src/dbusobjectmanagerclient.ccg
+++ b/gio/src/dbusobjectmanagerclient.ccg
@@ -18,7 +18,9 @@
namespace
{
-GType get_proxy_type_callback(GDBusObjectManagerClient* manager,
+extern "C"
+{
+static GType get_proxy_type_callback(GDBusObjectManagerClient* manager,
const gchar* object_path, const gchar* interface_name, gpointer user_data)
{
auto slot_proxy_type = static_cast<Gio::DBus::ObjectManagerClient::SlotProxyType*>(user_data);
@@ -35,6 +37,11 @@ GType get_proxy_type_callback(GDBusObjectManagerClient* manager,
return 0;
}
+static void proxy_type_callback_delete(void* data)
+{
+ delete static_cast<Gio::DBus::ObjectManagerClient::SlotProxyType*>(data);
+}
+} // extern "C"
} // anonymous namespace
namespace Gio
@@ -56,7 +63,7 @@ ObjectManagerClient::ObjectManagerClient(const Glib::RefPtr<Connection>& connect
"object-path", Glib::c_str_or_nullptr(object_path),
"get-proxy-type-func", slot_proxy_type ? get_proxy_type_callback : nullptr,
"get-proxy-type-user-data", slot_proxy_type ? new SlotProxyType(slot_proxy_type) : nullptr,
- "get-proxy-type-destroy-notify", slot_proxy_type ? Glib::destroy_notify_delete<SlotProxyType> : nullptr
+ "get-proxy-type-destroy-notify", slot_proxy_type ? proxy_type_callback_delete : nullptr
)
{
if (slot_async_ready)
@@ -88,7 +95,7 @@ ObjectManagerClient::ObjectManagerClient(BusType bus_type,
"object-path", Glib::c_str_or_nullptr(object_path),
"get-proxy-type-func", slot_proxy_type ? get_proxy_type_callback : nullptr,
"get-proxy-type-user-data", slot_proxy_type ? new SlotProxyType(slot_proxy_type) : nullptr,
- "get-proxy-type-destroy-notify", slot_proxy_type ? Glib::destroy_notify_delete<SlotProxyType> : nullptr
+ "get-proxy-type-destroy-notify", slot_proxy_type ? proxy_type_callback_delete : nullptr
)
{
if (slot_async_ready)