summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2017-03-20 12:27:17 +0100
committerThomas Haller <thaller@redhat.com>2017-03-22 12:41:06 +0100
commitc7ccdf5fc893fd41f23349f298bf2c3ea383487a (patch)
tree4c5a8d155e945b98275312af7f35a731e9e73b96
parentc48c13b8e5ef7aa282e1045fff1f80d41836bcbf (diff)
downloadNetworkManager-c7ccdf5fc893fd41f23349f298bf2c3ea383487a.tar.gz
libnm/udev: cache and reuse udev instance for NMDevice
No need to create a separate NMUdevClient instance for all devices. Instead, have one "struct udev" instance in NMClient and pass it down during object construction.
-rw-r--r--libnm/nm-client.c21
-rw-r--r--libnm/nm-device.c37
-rw-r--r--libnm/nm-object-private.h3
3 files changed, 41 insertions, 20 deletions
diff --git a/libnm/nm-client.c b/libnm/nm-client.c
index 308402ee51..cc3984be41 100644
--- a/libnm/nm-client.c
+++ b/libnm/nm-client.c
@@ -22,6 +22,7 @@
#include "nm-default.h"
#include <string.h>
+#include <libudev.h>
#include "nm-utils.h"
#include "nm-client.h"
@@ -96,6 +97,7 @@ typedef struct {
NMDnsManager *dns_manager;
GDBusObjectManager *object_manager;
GCancellable *new_object_manager_cancellable;
+ struct udev *udev;
} NMClientPrivate;
enum {
@@ -2018,8 +2020,9 @@ proxy_type (GDBusObjectManagerClient *manager,
}
static NMObject *
-obj_nm_for_gdbus_object (GDBusObject *object, GDBusObjectManager *object_manager)
+obj_nm_for_gdbus_object (NMClient *self, GDBusObject *object, GDBusObjectManager *object_manager)
{
+ NMClientPrivate *priv;
GList *interfaces;
GList *l;
GType type = G_TYPE_INVALID;
@@ -2111,6 +2114,12 @@ obj_nm_for_gdbus_object (GDBusObject *object, GDBusObjectManager *object_manager
NM_OBJECT_DBUS_OBJECT, object,
NM_OBJECT_DBUS_OBJECT_MANAGER, object_manager,
NULL);
+ if (NM_IS_DEVICE (object)) {
+ priv = NM_CLIENT_GET_PRIVATE (self);
+ if (!priv->udev)
+ priv->udev = udev_new ();
+ _nm_device_set_udev (NM_DEVICE (obj_nm), priv->udev);
+ }
g_object_set_qdata_full (G_OBJECT (object), _nm_object_obj_nm_quark (),
obj_nm, g_object_unref);
return obj_nm;
@@ -2130,9 +2139,10 @@ obj_nm_inited (GObject *object, GAsyncResult *result, gpointer user_data)
static void
object_added (GDBusObjectManager *object_manager, GDBusObject *object, gpointer user_data)
{
+ NMClient *client = user_data;
NMObject *obj_nm;
- obj_nm = obj_nm_for_gdbus_object (object, object_manager);
+ obj_nm = obj_nm_for_gdbus_object (client, object, object_manager);
if (obj_nm) {
g_async_initable_init_async (G_ASYNC_INITABLE (obj_nm),
G_PRIORITY_DEFAULT, NULL,
@@ -2159,7 +2169,7 @@ objects_created (NMClient *client, GDBusObjectManager *object_manager, GError **
/* First just ensure all the NMObjects for known GDBusObjects exist. */
objects = g_dbus_object_manager_get_objects (object_manager);
for (iter = objects; iter; iter = iter->next)
- obj_nm_for_gdbus_object (iter->data, object_manager);
+ obj_nm_for_gdbus_object (client, iter->data, object_manager);
g_list_free_full (objects, g_object_unref);
manager = g_dbus_object_manager_get_object (object_manager, NM_DBUS_PATH);
@@ -2559,6 +2569,11 @@ dispose (GObject *object)
}
G_OBJECT_CLASS (nm_client_parent_class)->dispose (object);
+
+ if (priv->udev) {
+ udev_unref (priv->udev);
+ priv->udev = NULL;
+ }
}
static void
diff --git a/libnm/nm-device.c b/libnm/nm-device.c
index 3629a8471b..5fba2e2000 100644
--- a/libnm/nm-device.c
+++ b/libnm/nm-device.c
@@ -40,7 +40,6 @@
#include "nm-dbus-helpers.h"
#include "nm-device-tun.h"
#include "nm-setting-connection.h"
-#include "nm-utils/nm-udev-utils.h"
#include "introspection/org.freedesktop.NetworkManager.Device.h"
@@ -80,7 +79,7 @@ typedef struct {
NMActiveConnection *active_connection;
GPtrArray *available_connections;
- NMUdevClient *udev_client;
+ struct udev *udev;
char *product, *short_product;
char *vendor, *short_vendor;
char *description, *bus_name;
@@ -295,7 +294,8 @@ dispose (GObject *object)
g_clear_object (&priv->dhcp6_config);
g_clear_object (&priv->active_connection);
- priv->udev_client = nm_udev_client_unref (priv->udev_client);
+ udev_unref (priv->udev);
+ priv->udev = NULL;
g_clear_pointer (&priv->available_connections, g_ptr_array_unref);
g_clear_pointer (&priv->lldp_neighbors, g_ptr_array_unref);
@@ -1332,16 +1332,19 @@ get_decoded_property (struct udev_device *device, const char *property)
return unescaped;
}
-static gboolean
-ensure_udev_client (NMDevice *device)
+void
+_nm_device_set_udev (NMDevice *device, struct udev *udev)
{
- NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (device);
+ NMDevicePrivate *priv;
- if (!priv->udev_client) {
- priv->udev_client = nm_udev_client_new ((const char *[]) { "net", "tty", NULL },
- NULL, NULL);
- }
- return !!priv->udev_client;
+ nm_assert (NM_IS_DEVICE (device));
+ nm_assert (udev);
+
+ priv = NM_DEVICE_GET_PRIVATE (device);
+
+ nm_assert (!priv->udev);
+
+ priv->udev = udev_ref (udev);
}
static char *
@@ -1355,16 +1358,16 @@ _get_udev_property (NMDevice *device,
guint32 count = 0;
char *enc_value = NULL, *db_value = NULL;
- if (!ensure_udev_client (device))
+ if (!priv->udev)
return NULL;
ifname = nm_device_get_iface (device);
if (!ifname)
return NULL;
- udev_device = udev_device_new_from_subsystem_sysname (nm_udev_client_get_udev (priv->udev_client), "net", ifname);
+ udev_device = udev_device_new_from_subsystem_sysname (priv->udev, "net", ifname);
if (!udev_device) {
- udev_device = udev_device_new_from_subsystem_sysname (nm_udev_client_get_udev (priv->udev_client), "tty", ifname);
+ udev_device = udev_device_new_from_subsystem_sysname (priv->udev, "tty", ifname);
if (!udev_device)
return NULL;
}
@@ -1734,16 +1737,16 @@ get_bus_name (NMDevice *device)
if (priv->bus_name)
goto out;
- if (!ensure_udev_client (device))
+ if (!priv->udev)
return NULL;
ifname = nm_device_get_iface (device);
if (!ifname)
return NULL;
- udevice = udev_device_new_from_subsystem_sysname (nm_udev_client_get_udev (priv->udev_client), "net", ifname);
+ udevice = udev_device_new_from_subsystem_sysname (priv->udev, "net", ifname);
if (!udevice) {
- udevice = udev_device_new_from_subsystem_sysname (nm_udev_client_get_udev (priv->udev_client), "tty", ifname);
+ udevice = udev_device_new_from_subsystem_sysname (priv->udev, "tty", ifname);
if (!udevice)
return NULL;
}
diff --git a/libnm/nm-object-private.h b/libnm/nm-object-private.h
index 63c4142d81..8c2f3a9cf4 100644
--- a/libnm/nm-object-private.h
+++ b/libnm/nm-object-private.h
@@ -56,4 +56,7 @@ void _nm_object_set_property (NMObject *object,
GDBusProxy *_nm_object_get_proxy (NMObject *object,
const char *interface);
+struct udev;
+void _nm_device_set_udev (NMDevice *device, struct udev *udev);
+
#endif /* __NM_OBJECT_PRIVATE_H__ */