summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2017-11-21 14:01:02 +0100
committerThomas Haller <thaller@redhat.com>2017-11-21 14:01:09 +0100
commit7ce8a1e67756e0b23024fc09400a4edcf0fb5be6 (patch)
tree5bf4719f67590f1bbee3b482632aa4ec88472629
parent3c8c63dcca9e6e8e8500d53589a5e8c56b78a4ff (diff)
downloadNetworkManager-7ce8a1e67756e0b23024fc09400a4edcf0fb5be6.tar.gz
libnm: cache lookup index for nm_setting_bond_get_option()
-rw-r--r--libnm-core/nm-setting-bond.c42
1 files changed, 27 insertions, 15 deletions
diff --git a/libnm-core/nm-setting-bond.c b/libnm-core/nm-setting-bond.c
index 8a15500c28..44219bfe23 100644
--- a/libnm-core/nm-setting-bond.c
+++ b/libnm-core/nm-setting-bond.c
@@ -54,6 +54,7 @@ enum {
typedef struct {
GHashTable *options;
+ NMUtilsNamedValue *options_idx_cache;
} NMSettingBondPrivate;
G_DEFINE_TYPE_WITH_CODE (NMSettingBond, nm_setting_bond, NM_TYPE_SETTING,
@@ -159,7 +160,6 @@ nm_setting_bond_get_option (NMSettingBond *setting,
{
NMSettingBondPrivate *priv;
guint i, len;
- gs_free NMUtilsNamedValue *options = NULL;
GHashTableIter iter;
const char *key, *value;
@@ -171,21 +171,26 @@ nm_setting_bond_get_option (NMSettingBond *setting,
if (idx >= len)
return FALSE;
- i = 0;
- options = g_new (NMUtilsNamedValue, len);
- g_hash_table_iter_init (&iter, priv->options);
- while (g_hash_table_iter_next (&iter, (gpointer *) &key, (gpointer *) &value)) {
- options[i].name = key;
- options[i].value_str = value;
- i++;
- }
- nm_assert (i == len);
+ if (!G_UNLIKELY (priv->options_idx_cache)) {
+ NMUtilsNamedValue *options;
- g_qsort_with_data (options, len, sizeof (options[0]),
- nm_utils_named_entry_cmp_with_data, NULL);
+ i = 0;
+ options = g_new (NMUtilsNamedValue, len);
+ g_hash_table_iter_init (&iter, priv->options);
+ while (g_hash_table_iter_next (&iter, (gpointer *) &key, (gpointer *) &value)) {
+ options[i].name = key;
+ options[i].value_str = value;
+ i++;
+ }
+ nm_assert (i == len);
- NM_SET_OUT (out_name, options[idx].name);
- NM_SET_OUT (out_value, options[idx].value_str);
+ g_qsort_with_data (options, len, sizeof (options[0]),
+ nm_utils_named_entry_cmp_with_data, NULL);
+ priv->options_idx_cache = options;
+ }
+
+ NM_SET_OUT (out_name, priv->options_idx_cache[idx].name);
+ NM_SET_OUT (out_value, priv->options_idx_cache[idx].value_str);
return TRUE;
}
@@ -365,6 +370,7 @@ nm_setting_bond_add_option (NMSettingBond *setting,
priv = NM_SETTING_BOND_GET_PRIVATE (setting);
+ nm_clear_g_free (&priv->options_idx_cache);
g_hash_table_insert (priv->options, g_strdup (name), g_strdup (value));
if ( !strcmp (name, NM_SETTING_BOND_OPTION_MIIMON)
@@ -398,6 +404,7 @@ gboolean
nm_setting_bond_remove_option (NMSettingBond *setting,
const char *name)
{
+ NMSettingBondPrivate *priv;
gboolean found;
g_return_val_if_fail (NM_IS_SETTING_BOND (setting), FALSE);
@@ -405,7 +412,10 @@ nm_setting_bond_remove_option (NMSettingBond *setting,
if (!nm_setting_bond_validate_option (name, NULL))
return FALSE;
- found = g_hash_table_remove (NM_SETTING_BOND_GET_PRIVATE (setting)->options, name);
+ priv = NM_SETTING_BOND_GET_PRIVATE (setting);
+
+ nm_clear_g_free (&priv->options_idx_cache);
+ found = g_hash_table_remove (priv->options, name);
if (found)
g_object_notify (G_OBJECT (setting), NM_SETTING_BOND_OPTIONS);
return found;
@@ -920,6 +930,7 @@ set_property (GObject *object, guint prop_id,
switch (prop_id) {
case PROP_OPTIONS:
+ nm_clear_g_free (&priv->options_idx_cache);
g_hash_table_unref (priv->options);
priv->options = _nm_utils_copy_strdict (g_value_get_boxed (value));
break;
@@ -960,6 +971,7 @@ finalize (GObject *object)
{
NMSettingBondPrivate *priv = NM_SETTING_BOND_GET_PRIVATE (object);
+ nm_clear_g_free (&priv->options_idx_cache);
g_hash_table_destroy (priv->options);
G_OBJECT_CLASS (nm_setting_bond_parent_class)->finalize (object);