diff options
author | Thomas Haller <thaller@redhat.com> | 2017-11-21 14:01:02 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2017-11-21 14:01:09 +0100 |
commit | 7ce8a1e67756e0b23024fc09400a4edcf0fb5be6 (patch) | |
tree | 5bf4719f67590f1bbee3b482632aa4ec88472629 | |
parent | 3c8c63dcca9e6e8e8500d53589a5e8c56b78a4ff (diff) | |
download | NetworkManager-7ce8a1e67756e0b23024fc09400a4edcf0fb5be6.tar.gz |
libnm: cache lookup index for nm_setting_bond_get_option()
-rw-r--r-- | libnm-core/nm-setting-bond.c | 42 |
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); |