summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2018-03-14 08:57:42 +0100
committerThomas Haller <thaller@redhat.com>2018-03-18 21:09:56 +0100
commit4737b34d358c68156e7b588b0d39599ef662ec65 (patch)
treeb5ca0fdcdbe2fdb9a895993df771fa92b05ba4fc
parentf761902d6d475f3613428b84a34fd15a480bb887 (diff)
downloadNetworkManager-4737b34d358c68156e7b588b0d39599ef662ec65.tar.gz
core: avoid clone of all-connections list for nm_utils_complete_generic()
NMSettings exposes a cached list of all connection. We don't need to clone it. Note that this is not save against concurrent modification, meaning, add/remove of connections in NMSettings will invalidate the list. However, it wasn't save against that previously either, because altough we cloned the container (GSList), we didn't take an additional reference to the elements. This is purely a performance optimization, we don't need to clone the list. Also, since the original list is of type "NMConnection *const*", use that type insistently, instead of dependent API requiring GSList. IMO, GSList is anyway not a very nice API in many usecases because it requires an additional slice allocation for each element.
-rw-r--r--src/NetworkManagerUtils.c79
-rw-r--r--src/NetworkManagerUtils.h2
-rw-r--r--src/devices/adsl/nm-device-adsl.c2
-rw-r--r--src/devices/bluetooth/nm-device-bt.c2
-rw-r--r--src/devices/nm-device-bond.c2
-rw-r--r--src/devices/nm-device-bridge.c2
-rw-r--r--src/devices/nm-device-dummy.c2
-rw-r--r--src/devices/nm-device-ethernet.c2
-rw-r--r--src/devices/nm-device-infiniband.c2
-rw-r--r--src/devices/nm-device-ip-tunnel.c2
-rw-r--r--src/devices/nm-device-macvlan.c2
-rw-r--r--src/devices/nm-device-tun.c2
-rw-r--r--src/devices/nm-device-vlan.c2
-rw-r--r--src/devices/nm-device-vxlan.c2
-rw-r--r--src/devices/nm-device.c2
-rw-r--r--src/devices/nm-device.h4
-rw-r--r--src/devices/team/nm-device-team.c2
-rw-r--r--src/devices/wifi/nm-device-iwd.c2
-rw-r--r--src/devices/wifi/nm-device-olpc-mesh.c2
-rw-r--r--src/devices/wifi/nm-device-wifi.c2
-rw-r--r--src/devices/wwan/nm-device-modem.c2
-rw-r--r--src/devices/wwan/nm-modem-broadband.c2
-rw-r--r--src/devices/wwan/nm-modem.c2
-rw-r--r--src/devices/wwan/nm-modem.h4
-rw-r--r--src/nm-manager.c19
25 files changed, 67 insertions, 81 deletions
diff --git a/src/NetworkManagerUtils.c b/src/NetworkManagerUtils.c
index ad6f32cafe..438b3584c1 100644
--- a/src/NetworkManagerUtils.c
+++ b/src/NetworkManagerUtils.c
@@ -67,38 +67,42 @@ nm_utils_get_shared_wifi_permission (NMConnection *connection)
/*****************************************************************************/
static char *
-get_new_connection_name (const GSList *existing_connections,
+get_new_connection_name (NMConnection *const*existing_connections,
const char *preferred,
const char *fallback_prefix)
{
- GSList *names = NULL;
- const GSList *iter;
- char *cname = NULL;
- guint i;
+ gs_free const char **existing_names = NULL;
+ guint i, existing_len = 0;
g_assert (fallback_prefix);
- for (iter = existing_connections; iter; iter = g_slist_next (iter)) {
- NMConnection *candidate = NM_CONNECTION (iter->data);
- const char *id;
+ if (existing_connections) {
+ existing_len = NM_PTRARRAY_LEN (existing_connections);
+ existing_names = g_new (const char *, existing_len);
+ for (i = 0; i < existing_len; i++) {
+ NMConnection *candidate;
+ const char *id;
- id = nm_connection_get_id (candidate);
- nm_assert (id);
+ candidate = existing_connections[i];
+ nm_assert (NM_IS_CONNECTION (candidate));
- names = g_slist_append (names, (gpointer) id);
+ id = nm_connection_get_id (candidate);
+ nm_assert (id);
- if ( preferred
- && nm_streq (preferred, id)) {
- /* the preferred name is already taken. Forget about it. */
- preferred = NULL;
+ existing_names[i] = id;
+
+ if ( preferred
+ && nm_streq (preferred, id)) {
+ /* the preferred name is already taken. Forget about it. */
+ preferred = NULL;
+ }
}
+ nm_assert (!existing_connections[i]);
}
/* Return the preferred name if it was unique */
- if (preferred) {
- g_slist_free (names);
+ if (preferred)
return g_strdup (preferred);
- }
/* Otherwise find the next available unique connection name using the given
* connection name template.
@@ -112,28 +116,25 @@ get_new_connection_name (const GSList *existing_connections,
* connection id. */
temp = g_strdup_printf (C_("connection id fallback", "%s %u"),
fallback_prefix, i);
- for (iter = names; iter; iter = g_slist_next (iter)) {
- if (nm_streq (iter->data, temp)) {
- cname = temp;
- goto found;
- }
- }
+
+ if (nm_utils_strv_find_first (NM_UNCONST_PPTR (char, existing_names),
+ existing_len,
+ temp) < 0)
+ return temp;
+
g_free (temp);
}
-found:
- g_slist_free (names);
- return cname;
+ return NULL;
}
static char *
get_new_connection_ifname (NMPlatform *platform,
- const GSList *existing_connections,
+ NMConnection *const*existing_connections,
const char *prefix)
{
- guint i;
+ guint i, j;
char *name;
- const GSList *iter;
gboolean found;
for (i = 0; TRUE; i++) {
@@ -142,23 +143,23 @@ get_new_connection_ifname (NMPlatform *platform,
if (nm_platform_link_get_by_ifname (platform, name))
goto next;
- for (iter = existing_connections, found = FALSE; iter; iter = g_slist_next (iter)) {
- NMConnection *candidate = iter->data;
+ if (existing_connections) {
+ for (j = 0; existing_connections[j]; j++) {
+ NMConnection *candidate = existing_connections[j];
- if (nm_streq0 (nm_connection_get_interface_name (candidate), name)) {
- found = TRUE;
- break;
+ if (nm_streq0 (nm_connection_get_interface_name (candidate), name)) {
+ found = TRUE;
+ break;
+ }
}
}
if (!found)
return name;
- next:
+next:
g_free (name);
}
-
- return NULL;
}
const char *
@@ -250,7 +251,7 @@ void
nm_utils_complete_generic (NMPlatform *platform,
NMConnection *connection,
const char *ctype,
- const GSList *existing_connections,
+ NMConnection *const*existing_connections,
const char *preferred_id,
const char *fallback_id_prefix,
const char *ifname_prefix,
diff --git a/src/NetworkManagerUtils.h b/src/NetworkManagerUtils.h
index 1947a316cf..13bdb67e85 100644
--- a/src/NetworkManagerUtils.h
+++ b/src/NetworkManagerUtils.h
@@ -31,7 +31,7 @@ const char *nm_utils_get_shared_wifi_permission (NMConnection *connection);
void nm_utils_complete_generic (NMPlatform *platform,
NMConnection *connection,
const char *ctype,
- const GSList *existing_connections,
+ NMConnection *const*existing_connections,
const char *preferred_id,
const char *fallback_id_prefix,
const char *ifname_prefix,
diff --git a/src/devices/adsl/nm-device-adsl.c b/src/devices/adsl/nm-device-adsl.c
index ed7b868d24..9133137682 100644
--- a/src/devices/adsl/nm-device-adsl.c
+++ b/src/devices/adsl/nm-device-adsl.c
@@ -114,7 +114,7 @@ static gboolean
complete_connection (NMDevice *device,
NMConnection *connection,
const char *specific_object,
- const GSList *existing_connections,
+ NMConnection *const*existing_connections,
GError **error)
{
NMSettingAdsl *s_adsl;
diff --git a/src/devices/bluetooth/nm-device-bt.c b/src/devices/bluetooth/nm-device-bt.c
index 0b794cbaa5..1d237d9277 100644
--- a/src/devices/bluetooth/nm-device-bt.c
+++ b/src/devices/bluetooth/nm-device-bt.c
@@ -215,7 +215,7 @@ static gboolean
complete_connection (NMDevice *device,
NMConnection *connection,
const char *specific_object,
- const GSList *existing_connections,
+ NMConnection *const*existing_connections,
GError **error)
{
NMDeviceBtPrivate *priv = NM_DEVICE_BT_GET_PRIVATE ((NMDeviceBt *) device);
diff --git a/src/devices/nm-device-bond.c b/src/devices/nm-device-bond.c
index 94131bf9f4..2dd9494a8b 100644
--- a/src/devices/nm-device-bond.c
+++ b/src/devices/nm-device-bond.c
@@ -76,7 +76,7 @@ static gboolean
complete_connection (NMDevice *device,
NMConnection *connection,
const char *specific_object,
- const GSList *existing_connections,
+ NMConnection *const*existing_connections,
GError **error)
{
NMSettingBond *s_bond;
diff --git a/src/devices/nm-device-bridge.c b/src/devices/nm-device-bridge.c
index 22d2d6bb24..c81a025338 100644
--- a/src/devices/nm-device-bridge.c
+++ b/src/devices/nm-device-bridge.c
@@ -115,7 +115,7 @@ static gboolean
complete_connection (NMDevice *device,
NMConnection *connection,
const char *specific_object,
- const GSList *existing_connections,
+ NMConnection *const*existing_connections,
GError **error)
{
NMSettingBridge *s_bridge;
diff --git a/src/devices/nm-device-dummy.c b/src/devices/nm-device-dummy.c
index 07647897ea..f8bc8e7521 100644
--- a/src/devices/nm-device-dummy.c
+++ b/src/devices/nm-device-dummy.c
@@ -55,7 +55,7 @@ static gboolean
complete_connection (NMDevice *device,
NMConnection *connection,
const char *specific_object,
- const GSList *existing_connections,
+ NMConnection *const*existing_connections,
GError **error)
{
NMSettingDummy *s_dummy;
diff --git a/src/devices/nm-device-ethernet.c b/src/devices/nm-device-ethernet.c
index 930ab2bac7..16fa431463 100644
--- a/src/devices/nm-device-ethernet.c
+++ b/src/devices/nm-device-ethernet.c
@@ -1371,7 +1371,7 @@ static gboolean
complete_connection (NMDevice *device,
NMConnection *connection,
const char *specific_object,
- const GSList *existing_connections,
+ NMConnection *const*existing_connections,
GError **error)
{
NMSettingWired *s_wired;
diff --git a/src/devices/nm-device-infiniband.c b/src/devices/nm-device-infiniband.c
index dbba257888..781bbd6921 100644
--- a/src/devices/nm-device-infiniband.c
+++ b/src/devices/nm-device-infiniband.c
@@ -175,7 +175,7 @@ static gboolean
complete_connection (NMDevice *device,
NMConnection *connection,
const char *specific_object,
- const GSList *existing_connections,
+ NMConnection *const*existing_connections,
GError **error)
{
NMSettingInfiniband *s_infiniband;
diff --git a/src/devices/nm-device-ip-tunnel.c b/src/devices/nm-device-ip-tunnel.c
index f0ee79ccb2..59ca9ed557 100644
--- a/src/devices/nm-device-ip-tunnel.c
+++ b/src/devices/nm-device-ip-tunnel.c
@@ -358,7 +358,7 @@ static gboolean
complete_connection (NMDevice *device,
NMConnection *connection,
const char *specific_object,
- const GSList *existing_connections,
+ NMConnection *const*existing_connections,
GError **error)
{
NMSettingIPTunnel *s_ip_tunnel;
diff --git a/src/devices/nm-device-macvlan.c b/src/devices/nm-device-macvlan.c
index cc4b984222..b8e748d660 100644
--- a/src/devices/nm-device-macvlan.c
+++ b/src/devices/nm-device-macvlan.c
@@ -334,7 +334,7 @@ static gboolean
complete_connection (NMDevice *device,
NMConnection *connection,
const char *specific_object,
- const GSList *existing_connections,
+ NMConnection *const*existing_connections,
GError **error)
{
NMSettingMacvlan *s_macvlan;
diff --git a/src/devices/nm-device-tun.c b/src/devices/nm-device-tun.c
index 5dd53054d0..6c4d5d5256 100644
--- a/src/devices/nm-device-tun.c
+++ b/src/devices/nm-device-tun.c
@@ -132,7 +132,7 @@ static gboolean
complete_connection (NMDevice *device,
NMConnection *connection,
const char *specific_object,
- const GSList *existing_connections,
+ NMConnection *const*existing_connections,
GError **error)
{
NMSettingTun *s_tun;
diff --git a/src/devices/nm-device-vlan.c b/src/devices/nm-device-vlan.c
index 8737f10b6a..ae6a0f3690 100644
--- a/src/devices/nm-device-vlan.c
+++ b/src/devices/nm-device-vlan.c
@@ -379,7 +379,7 @@ static gboolean
complete_connection (NMDevice *device,
NMConnection *connection,
const char *specific_object,
- const GSList *existing_connections,
+ NMConnection *const*existing_connections,
GError **error)
{
NMSettingVlan *s_vlan;
diff --git a/src/devices/nm-device-vxlan.c b/src/devices/nm-device-vxlan.c
index d16754f9ee..e125222374 100644
--- a/src/devices/nm-device-vxlan.c
+++ b/src/devices/nm-device-vxlan.c
@@ -314,7 +314,7 @@ static gboolean
complete_connection (NMDevice *device,
NMConnection *connection,
const char *specific_object,
- const GSList *existing_connections,
+ NMConnection *const*existing_connections,
GError **error)
{
NMSettingVxlan *s_vxlan;
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index 2e05673d19..b23ab3e063 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -4787,7 +4787,7 @@ gboolean
nm_device_complete_connection (NMDevice *self,
NMConnection *connection,
const char *specific_object,
- const GSList *existing_connections,
+ NMConnection *const*existing_connections,
GError **error)
{
NMDeviceClass *klass;
diff --git a/src/devices/nm-device.h b/src/devices/nm-device.h
index f990f8331e..4ed852bc65 100644
--- a/src/devices/nm-device.h
+++ b/src/devices/nm-device.h
@@ -312,7 +312,7 @@ typedef struct {
gboolean (* complete_connection) (NMDevice *self,
NMConnection *connection,
const char *specific_object,
- const GSList *existing_connections,
+ NMConnection *const*existing_connections,
GError **error);
NMActStageReturn (* act_stage1_prepare) (NMDevice *self,
@@ -520,7 +520,7 @@ gboolean nm_device_can_auto_connect (NMDevice *self,
gboolean nm_device_complete_connection (NMDevice *device,
NMConnection *connection,
const char *specific_object,
- const GSList *existing_connection,
+ NMConnection *const*existing_connections,
GError **error);
gboolean nm_device_check_connection_compatible (NMDevice *device, NMConnection *connection);
diff --git a/src/devices/team/nm-device-team.c b/src/devices/team/nm-device-team.c
index 2f1dbde39f..f83ba22b5d 100644
--- a/src/devices/team/nm-device-team.c
+++ b/src/devices/team/nm-device-team.c
@@ -104,7 +104,7 @@ static gboolean
complete_connection (NMDevice *device,
NMConnection *connection,
const char *specific_object,
- const GSList *existing_connections,
+ NMConnection *const*existing_connections,
GError **error)
{
NMSettingTeam *s_team;
diff --git a/src/devices/wifi/nm-device-iwd.c b/src/devices/wifi/nm-device-iwd.c
index f3a3a87921..40980b06f0 100644
--- a/src/devices/wifi/nm-device-iwd.c
+++ b/src/devices/wifi/nm-device-iwd.c
@@ -644,7 +644,7 @@ static gboolean
complete_connection (NMDevice *device,
NMConnection *connection,
const char *specific_object,
- const GSList *existing_connections,
+ NMConnection *const*existing_connections,
GError **error)
{
NMDeviceIwd *self = NM_DEVICE_IWD (device);
diff --git a/src/devices/wifi/nm-device-olpc-mesh.c b/src/devices/wifi/nm-device-olpc-mesh.c
index a330de038d..c3d070d98d 100644
--- a/src/devices/wifi/nm-device-olpc-mesh.c
+++ b/src/devices/wifi/nm-device-olpc-mesh.c
@@ -113,7 +113,7 @@ static gboolean
complete_connection (NMDevice *device,
NMConnection *connection,
const char *specific_object,
- const GSList *existing_connections,
+ NMConnection *const*existing_connections,
GError **error)
{
NMSettingOlpcMesh *s_mesh;
diff --git a/src/devices/wifi/nm-device-wifi.c b/src/devices/wifi/nm-device-wifi.c
index 7aae9ea6ca..7c64d594b7 100644
--- a/src/devices/wifi/nm-device-wifi.c
+++ b/src/devices/wifi/nm-device-wifi.c
@@ -733,7 +733,7 @@ static gboolean
complete_connection (NMDevice *device,
NMConnection *connection,
const char *specific_object,
- const GSList *existing_connections,
+ NMConnection *const*existing_connections,
GError **error)
{
NMDeviceWifi *self = NM_DEVICE_WIFI (device);
diff --git a/src/devices/wwan/nm-device-modem.c b/src/devices/wwan/nm-device-modem.c
index 0820b82db0..2a3e9ebeb7 100644
--- a/src/devices/wwan/nm-device-modem.c
+++ b/src/devices/wwan/nm-device-modem.c
@@ -434,7 +434,7 @@ static gboolean
complete_connection (NMDevice *device,
NMConnection *connection,
const char *specific_object,
- const GSList *existing_connections,
+ NMConnection *const*existing_connections,
GError **error)
{
NMDeviceModemPrivate *priv = NM_DEVICE_MODEM_GET_PRIVATE ((NMDeviceModem *) device);
diff --git a/src/devices/wwan/nm-modem-broadband.c b/src/devices/wwan/nm-modem-broadband.c
index 683d6ed84f..0240633cca 100644
--- a/src/devices/wwan/nm-modem-broadband.c
+++ b/src/devices/wwan/nm-modem-broadband.c
@@ -663,7 +663,7 @@ check_connection_compatible (NMModem *_self, NMConnection *connection)
static gboolean
complete_connection (NMModem *_self,
NMConnection *connection,
- const GSList *existing_connections,
+ NMConnection *const*existing_connections,
GError **error)
{
NMModemBroadband *self = NM_MODEM_BROADBAND (_self);
diff --git a/src/devices/wwan/nm-modem.c b/src/devices/wwan/nm-modem.c
index b21861730c..85de86ee6c 100644
--- a/src/devices/wwan/nm-modem.c
+++ b/src/devices/wwan/nm-modem.c
@@ -1091,7 +1091,7 @@ nm_modem_check_connection_compatible (NMModem *self, NMConnection *connection)
gboolean
nm_modem_complete_connection (NMModem *self,
NMConnection *connection,
- const GSList *existing_connections,
+ NMConnection *const*existing_connections,
GError **error)
{
NMModemClass *klass;
diff --git a/src/devices/wwan/nm-modem.h b/src/devices/wwan/nm-modem.h
index a95da25534..3e281c0c92 100644
--- a/src/devices/wwan/nm-modem.h
+++ b/src/devices/wwan/nm-modem.h
@@ -126,7 +126,7 @@ typedef struct {
gboolean (*complete_connection) (NMModem *modem,
NMConnection *connection,
- const GSList *existing_connections,
+ NMConnection *const*existing_connections,
GError **error);
NMActStageReturn (*act_stage1_prepare) (NMModem *modem,
@@ -189,7 +189,7 @@ gboolean nm_modem_check_connection_compatible (NMModem *self, NMConnection *conn
gboolean nm_modem_complete_connection (NMModem *self,
NMConnection *connection,
- const GSList *existing_connections,
+ NMConnection *const*existing_connections,
GError **error);
void nm_modem_get_route_parameters (NMModem *self,
diff --git a/src/nm-manager.c b/src/nm-manager.c
index c621c76e1a..7764dbbee3 100644
--- a/src/nm-manager.c
+++ b/src/nm-manager.c
@@ -4515,7 +4515,6 @@ impl_manager_add_and_activate_connection (NMDBusObject *obj,
NMManager *self = NM_MANAGER (obj);
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
NMConnection *connection = NULL;
- GSList *all_connections = NULL;
NMActiveConnection *active = NULL;
NMAuthSubject *subject = NULL;
GError *error = NULL;
@@ -4554,17 +4553,6 @@ impl_manager_add_and_activate_connection (NMDBusObject *obj,
if (!subject)
goto error;
- {
- NMSettingsConnection *const*connections;
- guint i, len;
-
- connections = nm_settings_get_connections (priv->settings, &len);
- all_connections = NULL;
- for (i = len; i > 0; ) {
- i--;
- all_connections = g_slist_prepend (all_connections, connections[i]);
- }
- }
if (vpn) {
/* Try to fill the VPN's connection setting and name at least */
if (!nm_connection_get_setting_vpn (connection)) {
@@ -4578,7 +4566,7 @@ impl_manager_add_and_activate_connection (NMDBusObject *obj,
nm_utils_complete_generic (priv->platform,
connection,
NM_SETTING_VPN_SETTING_NAME,
- all_connections,
+ (NMConnection *const*) nm_settings_get_connections (priv->settings, NULL),
NULL,
_("VPN connection"),
NULL,
@@ -4588,12 +4576,10 @@ impl_manager_add_and_activate_connection (NMDBusObject *obj,
if (!nm_device_complete_connection (device,
connection,
specific_object_path,
- all_connections,
+ (NMConnection *const*) nm_settings_get_connections (priv->settings, NULL),
&error))
goto error;
}
- g_slist_free (all_connections);
- all_connections = NULL;
active = _new_active_connection (self,
connection,
@@ -4618,7 +4604,6 @@ impl_manager_add_and_activate_connection (NMDBusObject *obj,
error:
nm_audit_log_connection_op (NM_AUDIT_OP_CONN_ADD_ACTIVATE, NULL, FALSE, NULL, subject, error->message);
g_clear_object (&connection);
- g_slist_free (all_connections);
g_clear_object (&subject);
g_clear_object (&active);