diff options
author | Dan Williams <dcbw@redhat.com> | 2015-07-20 17:30:02 -0500 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2015-11-11 10:56:20 +0100 |
commit | cd9772280509a829d5e8efc46b74aa35b481d236 (patch) | |
tree | 1558bf8ab30afbe01236e0447e74382102a5ba4c /src/nm-exported-object.c | |
parent | 8d1233e67e0db2c53717d9bd1bf9935958ffd79a (diff) | |
download | NetworkManager-dcbw/gdbus-object-manager.tar.gz |
exported-object: add support for DBus ObjectManager interfacedcbw/gdbus-object-manager
NMExportedObject now derives from GDBusObjectSkeleton, which is what
GDBusObjectManagerServer wants. The main GDBusConnection and each
private server connection now gets a new GDBusObjectManagerServer,
and exported objects are registered with that instead of individually
exporting each GDBusInterfaceSkeleton.
Previously exported objects were not referenced by the BusManager,
but instead removed from the exports hash via weak references. The
GDBusObjectManagerServer instead references exported objects, which
can make them live much longer than they did before.
Co-Authored-By: Thomas Haller <thaller@redhat.com>
Diffstat (limited to 'src/nm-exported-object.c')
-rw-r--r-- | src/nm-exported-object.c | 42 |
1 files changed, 35 insertions, 7 deletions
diff --git a/src/nm-exported-object.c b/src/nm-exported-object.c index 0746fec0d4..ca3187e8ae 100644 --- a/src/nm-exported-object.c +++ b/src/nm-exported-object.c @@ -35,7 +35,7 @@ static gboolean quitting = FALSE; #define _ASSERT_NO_EARLY_EXPORT #endif -G_DEFINE_ABSTRACT_TYPE_WITH_CODE (NMExportedObject, nm_exported_object, G_TYPE_OBJECT, +G_DEFINE_ABSTRACT_TYPE_WITH_CODE (NMExportedObject, nm_exported_object, G_TYPE_DBUS_OBJECT_SKELETON, prefix_counters = g_hash_table_new (g_str_hash, g_str_equal); ) @@ -64,6 +64,19 @@ typedef struct { GQuark nm_exported_object_class_info_quark (void); G_DEFINE_QUARK (NMExportedObjectClassInfo, nm_exported_object_class_info) +/*****************************************************************************/ + +#define _NMLOG_PREFIX_NAME "exported-object" +#define _NMLOG_DOMAIN LOGD_CORE + +#define _NMLOG(level, ...) \ + nm_log (level, _NMLOG_DOMAIN, \ + "%s[%p]: " _NM_UTILS_MACRO_FIRST (__VA_ARGS__), \ + _NMLOG_PREFIX_NAME, (self) \ + _NM_UTILS_MACRO_REST (__VA_ARGS__)) + +/*****************************************************************************/ + /* "AddConnectionUnsaved" -> "handle-add-connection-unsaved" */ char * nm_exported_object_skeletonify_method_name (const char *dbus_method_name) @@ -461,6 +474,8 @@ nm_exported_object_create_skeletons (NMExportedObject *self, methods_len, (GObject *) self); + g_dbus_object_skeleton_add_interface ((GDBusObjectSkeleton *) self, interface); + priv->interfaces = g_slist_prepend (priv->interfaces, interface); } } @@ -498,6 +513,7 @@ nm_exported_object_destroy_skeletons (NMExportedObject *self) GDBusInterfaceSkeleton *interface = priv->interfaces->data; priv->interfaces = g_slist_delete_link (priv->interfaces, priv->interfaces); + g_dbus_object_skeleton_remove_interface ((GDBusObjectSkeleton *) self, interface); nm_exported_object_skeleton_release (interface); } } @@ -533,6 +549,11 @@ nm_exported_object_export (NMExportedObject *self) nm_assert (priv->_constructed); #endif + priv->bus_mgr = nm_bus_manager_get (); + if (!priv->bus_mgr) + g_return_val_if_reached (NULL); + g_object_add_weak_pointer ((GObject *) priv->bus_mgr, (gpointer *) &priv->bus_mgr); + class_export_path = NM_EXPORTED_OBJECT_GET_CLASS (self)->export_path; p = strchr (class_export_path, '%'); if (p) { @@ -551,18 +572,19 @@ nm_exported_object_export (NMExportedObject *self) } else priv->path = g_strdup (class_export_path); + _LOGT ("export: \"%s\"", priv->path); + g_dbus_object_skeleton_set_object_path (G_DBUS_OBJECT_SKELETON (self), priv->path); + type = G_OBJECT_TYPE (self); while (type != NM_TYPE_EXPORTED_OBJECT) { nm_exported_object_create_skeletons (self, type); type = g_type_parent (type); } - priv->bus_mgr = g_object_ref (nm_bus_manager_get ()); - /* Important: priv->path and priv->interfaces must not change while * the object is registered. */ - nm_bus_manager_register_object (priv->bus_mgr, self); + nm_bus_manager_register_object (priv->bus_mgr, (GDBusObjectSkeleton *) self); return priv->path; } @@ -615,17 +637,23 @@ nm_exported_object_unexport (NMExportedObject *self) priv = NM_EXPORTED_OBJECT_GET_PRIVATE (self); g_return_if_fail (priv->path); - g_return_if_fail (priv->bus_mgr); /* Important: priv->path and priv->interfaces must not change while * the object is registered. */ - nm_bus_manager_unregister_object (priv->bus_mgr, self); + _LOGT ("unexport: \"%s\"", priv->path); + + if (priv->bus_mgr) { + nm_bus_manager_unregister_object (priv->bus_mgr, (GDBusObjectSkeleton *) self); + g_object_remove_weak_pointer ((GObject *) priv->bus_mgr, (gpointer *) &priv->bus_mgr); + priv->bus_mgr = NULL; + } nm_exported_object_destroy_skeletons (self); + g_dbus_object_skeleton_set_object_path ((GDBusObjectSkeleton *) self, NULL); + g_clear_pointer (&priv->path, g_free); - g_clear_object (&priv->bus_mgr); if (nm_clear_g_source (&priv->notify_idle_id)) { /* We had a notification queued. Since we removed all interfaces, |