summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2015-01-21 12:58:32 +0100
committerLubomir Rintel <lkundrak@v3.sk>2015-05-05 16:51:54 +0200
commitd9f372f439b5b61576c6ab90d5ddf3f342a7c35a (patch)
treeaeaeff69240dcb05d7bc28161378983b9b304786
parent0efcf3c680214f2ea7d5cc1080d05239d7fa211a (diff)
downloadNetworkManager-lr/nm-1-0-rh1066697_reload_config.tar.gz
config: use flags argument in config-changed signal instead of a hash tablelr/nm-1-0-rh1066697_reload_config
(cherry picked from commit 5b47462f32489c726d6f79dfed431864d31f8dd2)
-rw-r--r--src/nm-config-data.c22
-rw-r--r--src/nm-config-data.h13
-rw-r--r--src/nm-config.c64
-rw-r--r--src/nm-config.h7
-rw-r--r--src/nm-manager.c2
5 files changed, 66 insertions, 42 deletions
diff --git a/src/nm-config-data.c b/src/nm-config-data.c
index cf140739fc..f1a7bcfc62 100644
--- a/src/nm-config-data.c
+++ b/src/nm-config-data.c
@@ -157,33 +157,31 @@ _keyfile_a_contains_all_in_b (GKeyFile *kf_a, GKeyFile *kf_b)
return TRUE;
}
-GHashTable *
+NMConfigChangeFlags
nm_config_data_diff (NMConfigData *old_data, NMConfigData *new_data)
{
- GHashTable *changes;
+ NMConfigChangeFlags changes = NM_CONFIG_CHANGE_NONE;
NMConfigDataPrivate *priv_old, *priv_new;
GSList *spec_old, *spec_new;
- g_return_val_if_fail (NM_IS_CONFIG_DATA (old_data), NULL);
- g_return_val_if_fail (NM_IS_CONFIG_DATA (new_data), NULL);
-
- changes = g_hash_table_new (g_str_hash, g_str_equal);
+ g_return_val_if_fail (NM_IS_CONFIG_DATA (old_data), NM_CONFIG_CHANGE_NONE);
+ g_return_val_if_fail (NM_IS_CONFIG_DATA (new_data), NM_CONFIG_CHANGE_NONE);
priv_old = NM_CONFIG_DATA_GET_PRIVATE (old_data);
priv_new = NM_CONFIG_DATA_GET_PRIVATE (new_data);
if ( !_keyfile_a_contains_all_in_b (priv_old->keyfile, priv_new->keyfile)
|| !_keyfile_a_contains_all_in_b (priv_new->keyfile, priv_old->keyfile))
- g_hash_table_insert (changes, NM_CONFIG_CHANGES_VALUES, NULL);
+ changes |= NM_CONFIG_CHANGE_VALUES;
if ( g_strcmp0 (nm_config_data_get_config_main_file (old_data), nm_config_data_get_config_main_file (new_data)) != 0
|| g_strcmp0 (nm_config_data_get_config_description (old_data), nm_config_data_get_config_description (new_data)) != 0)
- g_hash_table_insert (changes, NM_CONFIG_CHANGES_CONFIG_FILES, NULL);
+ changes |= NM_CONFIG_CHANGE_CONFIG_FILES;
if ( nm_config_data_get_connectivity_interval (old_data) != nm_config_data_get_connectivity_interval (new_data)
|| g_strcmp0 (nm_config_data_get_connectivity_uri (old_data), nm_config_data_get_connectivity_uri (new_data))
|| g_strcmp0 (nm_config_data_get_connectivity_response (old_data), nm_config_data_get_connectivity_response (new_data)))
- g_hash_table_insert (changes, NM_CONFIG_CHANGES_CONNECTIVITY, NULL);
+ changes |= NM_CONFIG_CHANGE_CONNECTIVITY;
spec_old = priv_old->no_auto_default.specs;
spec_new = priv_new->no_auto_default.specs;
@@ -192,12 +190,8 @@ nm_config_data_diff (NMConfigData *old_data, NMConfigData *new_data)
spec_new = spec_new->next;
}
if (spec_old || spec_new)
- g_hash_table_insert (changes, NM_CONFIG_CHANGES_NO_AUTO_DEFAULT, NULL);
+ changes |= NM_CONFIG_CHANGE_NO_AUTO_DEFAULT;
- if (!g_hash_table_size (changes)) {
- g_hash_table_destroy (changes);
- return NULL;
- }
return changes;
}
diff --git a/src/nm-config-data.h b/src/nm-config-data.h
index 59b2806ccd..bb88bf7ea2 100644
--- a/src/nm-config-data.h
+++ b/src/nm-config-data.h
@@ -44,6 +44,17 @@ G_BEGIN_DECLS
#define NM_CONFIG_DATA_CONNECTIVITY_RESPONSE "connectivity-response"
#define NM_CONFIG_DATA_NO_AUTO_DEFAULT "no-auto-default"
+typedef enum { /*< flags >*/
+ NM_CONFIG_CHANGE_NONE = 0,
+ NM_CONFIG_CHANGE_CONFIG_FILES = (1L << 0),
+ NM_CONFIG_CHANGE_VALUES = (1L << 1),
+ NM_CONFIG_CHANGE_CONNECTIVITY = (1L << 2),
+ NM_CONFIG_CHANGE_NO_AUTO_DEFAULT = (1L << 3),
+
+ _NM_CONFIG_CHANGE_LAST,
+ NM_CONFIG_CHANGE_ALL = ((_NM_CONFIG_CHANGE_LAST - 1) << 1) - 1,
+} NMConfigChangeFlags;
+
struct _NMConfigData {
GObject parent;
};
@@ -60,7 +71,7 @@ NMConfigData *nm_config_data_new (const char *config_main_file,
GKeyFile *keyfile);
NMConfigData *nm_config_data_new_update_no_auto_default (const NMConfigData *base, const char *const*no_auto_default);
-GHashTable *nm_config_data_diff (NMConfigData *old_data, NMConfigData *new_data);
+NMConfigChangeFlags nm_config_data_diff (NMConfigData *old_data, NMConfigData *new_data);
const char *nm_config_data_get_config_main_file (const NMConfigData *config_data);
const char *nm_config_data_get_config_description (const NMConfigData *config_data);
diff --git a/src/nm-config.c b/src/nm-config.c
index a20dfb4bc3..012b872aca 100644
--- a/src/nm-config.c
+++ b/src/nm-config.c
@@ -30,6 +30,8 @@
#include "nm-glib-compat.h"
#include "nm-device.h"
#include "NetworkManagerUtils.h"
+#include "gsystem-local-alloc.h"
+#include "nm-enum-types.h"
#include <gio/gio.h>
#include <glib/gi18n.h>
@@ -718,40 +720,60 @@ nm_config_reload (NMConfig *self)
_set_config_data (self, new_data);
}
+static const char *
+_change_flags_one_to_string (NMConfigChangeFlags flag)
+{
+ switch (flag) {
+ case NM_CONFIG_CHANGE_CONFIG_FILES:
+ return "config-files";
+ case NM_CONFIG_CHANGE_VALUES:
+ return "values";
+ case NM_CONFIG_CHANGE_CONNECTIVITY:
+ return "connectivity";
+ case NM_CONFIG_CHANGE_NO_AUTO_DEFAULT:
+ return "no-auto-default";
+ default:
+ g_return_val_if_reached ("unknown");
+ }
+}
+
+char *
+nm_config_change_flags_to_string (NMConfigChangeFlags flags)
+{
+ GString *str = g_string_new ("");
+ NMConfigChangeFlags s = 0x01;
+
+ while (flags) {
+ if (NM_FLAGS_HAS (flags, s)) {
+ if (str->len)
+ g_string_append_c (str, ',');
+ g_string_append (str, _change_flags_one_to_string (s));
+ }
+ flags = flags & ~s;
+ s <<= 1;
+ }
+ return g_string_free (str, FALSE);
+}
+
static void
_set_config_data (NMConfig *self, NMConfigData *new_data)
{
NMConfigPrivate *priv = NM_CONFIG_GET_PRIVATE (self);
NMConfigData *old_data = priv->config_data;
- GHashTable *changes;
+ NMConfigChangeFlags changes;
+ gs_free char *log_str = NULL;
changes = nm_config_data_diff (old_data, new_data);
-
- if (!changes) {
+ if (changes == NM_CONFIG_CHANGE_NONE) {
g_object_unref (new_data);
return;
}
- if (nm_logging_enabled (LOGL_INFO, LOGD_CORE)) {
- GString *str = g_string_new (NULL);
- GHashTableIter iter;
- const char *key;
-
- g_hash_table_iter_init (&iter, changes);
- while (g_hash_table_iter_next (&iter, (gpointer) &key, NULL)) {
- if (str->len)
- g_string_append (str, ",");
- g_string_append (str, key);
- }
- nm_log_info (LOGD_CORE, "config: update %s (%s)", nm_config_data_get_config_description (new_data), str->str);
- g_string_free (str, TRUE);
- }
-
+ nm_log_info (LOGD_CORE, "config: update %s (%s)", nm_config_data_get_config_description (new_data),
+ (log_str = nm_config_change_flags_to_string (changes)));
priv->config_data = new_data;
g_signal_emit (self, signals[SIGNAL_CONFIG_CHANGED], 0, new_data, changes, old_data);
g_object_unref (old_data);
-
- g_hash_table_destroy (changes);
}
NM_DEFINE_SINGLETON_DESTRUCTOR (NMConfig);
@@ -936,7 +958,7 @@ nm_config_class_init (NMConfigClass *config_class)
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (NMConfigClass, config_changed),
NULL, NULL, NULL,
- G_TYPE_NONE, 3, NM_TYPE_CONFIG_DATA, G_TYPE_HASH_TABLE, NM_TYPE_CONFIG_DATA);
+ G_TYPE_NONE, 3, NM_TYPE_CONFIG_DATA, NM_TYPE_CONFIG_CHANGE_FLAGS, NM_TYPE_CONFIG_DATA);
}
static void
diff --git a/src/nm-config.h b/src/nm-config.h
index b52a6b58f8..530cbade98 100644
--- a/src/nm-config.h
+++ b/src/nm-config.h
@@ -43,11 +43,6 @@ G_BEGIN_DECLS
/* Signals */
#define NM_CONFIG_SIGNAL_CONFIG_CHANGED "config-changed"
-#define NM_CONFIG_CHANGES_CONFIG_FILES "config-files"
-#define NM_CONFIG_CHANGES_VALUES "values"
-#define NM_CONFIG_CHANGES_CONNECTIVITY "connectivity"
-#define NM_CONFIG_CHANGES_NO_AUTO_DEFAULT "no-auto-default"
-
typedef struct NMConfigCmdLineOptions NMConfigCmdLineOptions;
struct _NMConfig {
@@ -65,6 +60,8 @@ GType nm_config_get_type (void);
NMConfig *nm_config_get (void);
+char *nm_config_change_flags_to_string (NMConfigChangeFlags flags);
+
NMConfigData *nm_config_get_data (NMConfig *config);
NMConfigData *nm_config_get_data_orig (NMConfig *config);
const char **nm_config_get_plugins (NMConfig *config);
diff --git a/src/nm-manager.c b/src/nm-manager.c
index 3281de13b9..54b4429a5c 100644
--- a/src/nm-manager.c
+++ b/src/nm-manager.c
@@ -466,7 +466,7 @@ active_connection_get_by_path (NMManager *manager, const char *path)
/************************************************************************/
static void
-_config_changed_cb (NMConfig *config, NMConfigData *config_data, GHashTable *changes, NMConfigData *old_data, NMManager *self)
+_config_changed_cb (NMConfig *config, NMConfigData *config_data, NMConfigChangeFlags changes, NMConfigData *old_data, NMManager *self)
{
g_object_set (NM_MANAGER_GET_PRIVATE (self)->connectivity,
NM_CONNECTIVITY_URI, nm_config_data_get_connectivity_uri (config_data),