summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2018-03-14 08:57:42 +0100
committerThomas Haller <thaller@redhat.com>2018-03-20 15:08:18 +0100
commite17cd1d742c47122b159040ce23fbf684b21c486 (patch)
tree5d3cee96a3068eb39539a61c52e5b989c2010969 /src
parentf063ab41e96b1b62719837a51f71ac1d44c44b10 (diff)
downloadNetworkManager-e17cd1d742c47122b159040ce23fbf684b21c486.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 for many use cases because it requires an additional slice allocation for each element. It's slower, and often less convenient to use.
Diffstat (limited to 'src')
-rw-r--r--src/NetworkManagerUtils.c83
-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, 66 insertions, 86 deletions
diff --git a/src/NetworkManagerUtils.c b/src/NetworkManagerUtils.c
index 35b077a7a1..12d46697ae 100644
--- a/src/NetworkManagerUtils.c
+++ b/src/NetworkManagerUtils.c
@@ -67,43 +67,47 @@ 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;
- 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.
*/
for (i = 1; TRUE; i++) {
- gboolean found = FALSE;
char *temp;
/* Translators: the first %s is a prefix for the connection id, such
@@ -112,53 +116,44 @@ 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)) {
- found = TRUE;
- break;
- }
- }
- if (!found) {
- g_slist_free (names);
+
+ if (nm_utils_strv_find_first ((char **) existing_names,
+ existing_len,
+ temp) < 0)
return temp;
- }
+
g_free (temp);
}
}
static char *
get_new_connection_ifname (NMPlatform *platform,
- const GSList *existing_connections,
+ NMConnection *const*existing_connections,
const char *prefix)
{
- guint i;
- char *name;
- const GSList *iter;
- gboolean found;
+ guint i, j;
for (i = 0; TRUE; i++) {
+ char *name;
+
name = g_strdup_printf ("%s%d", prefix, i);
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 (nm_streq0 (nm_connection_get_interface_name (candidate), name)) {
- found = TRUE;
- break;
+ if (existing_connections) {
+ for (j = 0; existing_connections[j]; j++) {
+ if (nm_streq0 (nm_connection_get_interface_name (existing_connections[j]),
+ name))
+ goto next;
}
}
- if (!found)
- return name;
+ return name;
- next:
+next:
g_free (name);
}
-
- return NULL;
}
const char *
@@ -250,7 +245,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 3573334b3d..123455f16d 100644
--- a/src/devices/nm-device-tun.c
+++ b/src/devices/nm-device-tun.c
@@ -145,7 +145,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 feb2a1b2b0..6c23a77286 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -4781,7 +4781,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 be0c236201..9a3744db3c 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 7dcbec1b41..61b7247ec8 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);