[PATCH 1/4] replace ohm_conf_get_keys with ohm_conf_keys_foreach and remove OhmConfobj

Rob Taylor rob.taylor at codethink.co.uk
Thu Aug 9 05:14:19 PDT 2007


Replace the inefficent and abi-messy ohm_conf_get_keys with an g_hash style
iterator. Remove OhmConfObj and replace with a small slice-allocated struct.
---
 ohmd/Makefile.am |    4 -
 ohmd/ohm-conf.c  |  188 +++++++++++++++++++-----------------------------------
 ohmd/ohm-conf.h  |   18 +++---
 3 files changed, 76 insertions(+), 134 deletions(-)

diff --git a/ohmd/Makefile.am b/ohmd/Makefile.am
index 9393e35..959e819 100644
--- a/ohmd/Makefile.am
+++ b/ohmd/Makefile.am
@@ -23,8 +23,6 @@ noinst_PROGRAMS = ohmd-test
 ohmd_test_SOURCES = 						\
 	ohm-debug.c						\
 	ohm-debug.h						\
-	ohm-confobj.c						\
-	ohm-confobj.h						\
 	ohm-conf.c						\
 	ohm-conf.h						\
 	ohm-marshal.h						\
@@ -38,8 +36,6 @@ ohmd_SOURCES = 							\
 	ohm-common.h						\
 	ohm-debug.c						\
 	ohm-debug.h						\
-	ohm-confobj.c						\
-	ohm-confobj.h						\
 	ohm-conf.c						\
 	ohm-conf.h						\
 	ohm-marshal.h						\
diff --git a/ohmd/ohm-conf.c b/ohmd/ohm-conf.c
index a231c62..ce0448d 100644
--- a/ohmd/ohm-conf.c
+++ b/ohmd/ohm-conf.c
@@ -38,7 +38,6 @@
 
 #include "ohm-debug.h"
 #include "ohm-conf.h"
-#include "ohm-confobj.h"
 #include "ohm-marshal.h"
 
 #define OHM_CONF_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), OHM_TYPE_CONF, OhmConfPrivate))
@@ -58,111 +57,37 @@ static guint	     signals [LAST_SIGNAL] = { 0, };
 
 G_DEFINE_TYPE (OhmConf, ohm_conf, G_TYPE_OBJECT)
 
-/**
- * ohm_conf_error_quark:
- * Return value: Our personal error quark.
- **/
-GQuark
-ohm_conf_error_quark (void)
+typedef struct ConfValue ConfValue;
+struct ConfValue
 {
-	static GQuark quark = 0;
-	if (!quark) {
-		quark = g_quark_from_static_string ("ohm_conf_error");
-	}
-	return quark;
-}
+	gboolean public;
+	gint value;
+};
 
-/**
- * ohm_conf_compare_func
- * A GCompareFunc for comparing two OhmConfKeyValue objects by name.
- **/
-static gint
-ohm_conf_compare_func (gconstpointer a, gconstpointer b)
+static ConfValue *
+new_conf_value ()
 {
-	OhmConfKeyValue *entry1 = (OhmConfKeyValue *) a;
-	OhmConfKeyValue *entry2 = (OhmConfKeyValue *) b;
-	return strcmp (entry1->name, entry2->name);
+	return g_slice_new (ConfValue);
 }
 
-/**
- * ohm_conf_to_slist_iter:
- **/
 static void
-ohm_conf_to_slist_iter (gpointer    key,
-			OhmConfObj *confobj,
-			gpointer   *user_data)
+free_conf_value (ConfValue *cv)
 {
-	OhmConfKeyValue *keyvalue;
-	GSList **list;
-
-	/* copy key values into the ABI stable struct to export */
-	keyvalue = g_new0 (OhmConfKeyValue, 1);
-	keyvalue->name = ohm_confobj_get_key (confobj);
-	keyvalue->value = ohm_confobj_get_value (confobj);
-	keyvalue->public = ohm_confobj_get_public (confobj);
-
-	/* add to list */
-	list = (GSList **) user_data;
-	*list = g_slist_prepend (*list, (gpointer) keyvalue);
+	g_slice_free (ConfValue, cv);
 }
 
 /**
- * ohm_conf_get_keys:
- * @conf: an #OhmConf object
- * @list: a pointer in which to return the list of keys
- *
- * Gets an ordered list of all the key values in #OhmConfKeyValue's.
- * Free the list with #ohm_conf_free_keys.
- *
- * Returns: FALSE if an error occured.
- **/
-gboolean
-ohm_conf_get_keys (OhmConf *conf,
-		   GSList **list)
-{
-	g_return_val_if_fail (OHM_IS_CONF (conf), FALSE);
-	g_return_val_if_fail (list != NULL, FALSE);
-	g_return_val_if_fail (*list == NULL, FALSE);
-
-	ohm_debug ("Get all keys and values in database");
-	if (conf->priv->keys == NULL) {
-		g_warning ("Conf invalid");
-		return FALSE;
-	}
-
-	/* add hash to unsorted SList */
-	g_hash_table_foreach (conf->priv->keys, (GHFunc) ohm_conf_to_slist_iter, list);
-
-	/* sort list */
-	*list = g_slist_sort (*list, ohm_conf_compare_func);
-	return TRUE;
-}
-
-/**
- * ohm_conf_free_keys:
- * @conf: an #OhmConf store
- * @list: list of keys as returned by #ohm_conf_get_keys
- *
- * Frees a list of keys, as returned from #ohm_conf_get_keys.
+ * ohm_conf_error_quark:
+ * Return value: Our personal error quark.
  **/
-gboolean
-ohm_conf_free_keys (OhmConf *conf,
-		    GSList  *list)
+GQuark
+ohm_conf_error_quark (void)
 {
-	GSList *l;
-	OhmConfKeyValue *keyvalue;
-
-	g_return_val_if_fail (OHM_IS_CONF (conf), FALSE);
-	g_return_val_if_fail (list != NULL, FALSE);
-
-	/* free the object only, text is an internal pointer */
-	for (l=list; l != NULL; l=l->next) {
-		keyvalue = (OhmConfKeyValue *) l->data;
-		g_free (keyvalue);
+	static GQuark quark = 0;
+	if (!quark) {
+		quark = g_quark_from_static_string ("ohm_conf_error");
 	}
-	g_slist_free (list);
-
-	return TRUE;
+	return quark;
 }
 
 /**
@@ -174,7 +99,8 @@ ohm_conf_get_key (OhmConf     *conf,
 		  gint        *value,
 		  GError     **error)
 {
-	OhmConfObj *confobj;
+	ConfValue *cv;
+
 	g_return_val_if_fail (OHM_IS_CONF (conf), FALSE);
 	g_return_val_if_fail (key != NULL, FALSE);
 	g_return_val_if_fail (value != NULL, FALSE);
@@ -190,8 +116,8 @@ ohm_conf_get_key (OhmConf     *conf,
 	}
 
 	/* try to find the key in the global conf */
-	confobj = g_hash_table_lookup (conf->priv->keys, key);
-	if (confobj == NULL) {
+	cv = g_hash_table_lookup (conf->priv->keys, key);
+	if (cv == NULL) {
 		*error = g_error_new (ohm_conf_error_quark (),
 				      OHM_CONF_ERROR_KEY_MISSING,
 				      "Key %s missing", key);
@@ -200,7 +126,7 @@ ohm_conf_get_key (OhmConf     *conf,
 	}
 
 	/* copy value from key */
-	*value = ohm_confobj_get_value (confobj);
+	*value = cv->value;
 	return TRUE;
 }
 
@@ -223,8 +149,7 @@ ohm_conf_add_key (OhmConf     *conf,
 		  gboolean     public,
 		  GError     **error)
 {
-	OhmConfObj *confobj;
-	gchar *confkey;
+	ConfValue *cv;
 
 	g_return_val_if_fail (OHM_IS_CONF (conf), FALSE);
 	g_return_val_if_fail (key != NULL, FALSE);
@@ -237,8 +162,8 @@ ohm_conf_add_key (OhmConf     *conf,
 	}
 
 	/* try to find the key in the global conf */
-	confobj = g_hash_table_lookup (conf->priv->keys, key);
-	if (confobj != NULL) {
+	cv = g_hash_table_lookup (conf->priv->keys, key);
+	if (cv != NULL) {
 		*error = g_error_new (ohm_conf_error_quark (),
 				      OHM_CONF_ERROR_KEY_ALREADY_EXISTS,
 				      "Key %s already exists", key);
@@ -247,12 +172,10 @@ ohm_conf_add_key (OhmConf     *conf,
 
 	/* create a new key */
 	ohm_debug ("create key '%s' : %i", key, value);
-	confobj = ohm_confobj_new ();
+	cv = new_conf_value();
 
-	/* maybe point to the key in the hashtable to save memory? */
-	ohm_confobj_set_key (confobj, key);
-	ohm_confobj_set_public (confobj, public);
-	ohm_confobj_set_value (confobj, value);
+	cv->public = public;
+	cv->value = value;
 
 	/* we need to create new objects in the store for each added user */
 
@@ -260,13 +183,41 @@ ohm_conf_add_key (OhmConf     *conf,
 	ohm_debug ("emit key-added : %s", key);
 	g_signal_emit (conf, signals [KEY_ADDED], 0, key, value);
 
-	/* add as the strdup'd value as key is constant */
-	confkey = ohm_confobj_get_key (confobj);
-	g_hash_table_insert (conf->priv->keys, (gpointer) g_strdup(confkey), (gpointer) confobj);
+	/* It'd be nice to have a cunning way to not strdup if the key was from
+	 * static data. Maybe a field in ConfValue to put the key in if it wasnt,
+	 * and an ohm_conf_add_key_static?
+	 */
+	g_hash_table_insert (conf->priv->keys, (gpointer) g_strdup(key), (gpointer) cv);
 
 	return TRUE;
 }
 
+typedef struct ForeachData ForeachData;
+struct ForeachData {
+	OhmConfForeachFunc func;
+	gpointer user_data;
+};
+
+static void
+foreach_keys (gpointer key,
+	      gpointer value,
+	      gpointer user_data)
+{
+	ForeachData *d = (ForeachData*) user_data;
+	ConfValue *cv = (ConfValue *)value;
+	d->func ((const char*)key, cv->public, cv->value, d->user_data);
+}
+
+void
+ohm_conf_keys_foreach(OhmConf		 *conf,
+		      OhmConfForeachFunc  func,
+		      gpointer		  user_data)
+{
+	ForeachData d = {func, user_data};
+	g_hash_table_foreach (conf->priv->keys, foreach_keys, &d);
+}
+
+
 /**
  * ohm_conf_set_key:
  *
@@ -279,9 +230,7 @@ ohm_conf_set_key_internal (OhmConf     *conf,
 		           gboolean     internal,
 		           GError     **error)
 {
-	OhmConfObj *confobj;
-	gboolean confpublic;
-	gint confobjvalue;
+	ConfValue *cv;
 
 	g_return_val_if_fail (OHM_IS_CONF (conf), FALSE);
 	g_return_val_if_fail (key != NULL, FALSE);
@@ -294,8 +243,8 @@ ohm_conf_set_key_internal (OhmConf     *conf,
 	}
 
 	/* try to find the key in the global conf */
-	confobj = g_hash_table_lookup (conf->priv->keys, key);
-	if (confobj == NULL) {
+	cv = g_hash_table_lookup (conf->priv->keys, key);
+	if (cv == NULL) {
 		*error = g_error_new (ohm_conf_error_quark (),
 				      OHM_CONF_ERROR_KEY_MISSING,
 				      "Key %s missing", key);
@@ -304,8 +253,7 @@ ohm_conf_set_key_internal (OhmConf     *conf,
 
 	/* if we are externally calling this key, check to see if
 	   we are allowed to set this key */
-	confpublic = ohm_confobj_get_public (confobj);
-	if (internal == FALSE && confpublic == FALSE) {
+	if (internal == FALSE && cv->public == FALSE) {
 		ohm_debug ("tried to set private key : %s", key);
 		*error = g_error_new (ohm_conf_error_quark (),
 				      OHM_CONF_ERROR_KEY_OVERRIDE,
@@ -317,9 +265,8 @@ ohm_conf_set_key_internal (OhmConf     *conf,
 	ohm_debug ("set existing key '%s' : %i", key, value);
 
 	/* Only force signal if different */
-	confobjvalue = ohm_confobj_get_value (confobj);
-	if (confobjvalue != value) {
-		ohm_confobj_set_value (confobj, value);
+	if (cv->value != value) {
+		cv->value = value;
 		ohm_debug ("emit key-changed : %s", key);
 		g_signal_emit (conf, signals [KEY_CHANGED], 0, key, value);
 	}
@@ -491,7 +438,6 @@ ohm_conf_finalize (GObject *object)
 	g_hash_table_unref (conf->priv->keys);
 	conf->priv->keys = NULL;
 
-	g_return_if_fail (conf->priv != NULL);
 	G_OBJECT_CLASS (ohm_conf_parent_class)->finalize (object);
 }
 
@@ -532,7 +478,7 @@ ohm_conf_init (OhmConf *conf)
 {
 	conf->priv = OHM_CONF_GET_PRIVATE (conf);
 	conf->priv->keys = g_hash_table_new_full (g_str_hash, g_str_equal,
-						  g_free, g_object_unref);
+						  g_free, (GDestroyNotify) free_conf_value);
 }
 
 /**
diff --git a/ohmd/ohm-conf.h b/ohmd/ohm-conf.h
index 726a586..1345899 100644
--- a/ohmd/ohm-conf.h
+++ b/ohmd/ohm-conf.h
@@ -45,13 +45,6 @@ typedef struct
 	GObjectClass	parent_class;
 } OhmConfClass;
 
-/* ABI stable representation suitable for consumption by session apps */
-typedef struct {
-	gchar		*name;
-	gint		 value;
-	gboolean	 public;
-} OhmConfKeyValue;
-
 typedef enum
 {
 	 OHM_CONF_ERROR_INVALID,
@@ -62,16 +55,23 @@ typedef enum
 	 OHM_CONF_ERROR_KEY_LAST
 } OhmConfError;
 
+typedef void (*OhmConfForeachFunc)			(const char *key,
+							 gboolean public,
+							 gint value,
+							 gpointer user_data);
+
 GType		 ohm_conf_get_type			(void);
 GQuark		 ohm_conf_error_quark			(void);
 OhmConf 	*ohm_conf_new				(void);
 
-gboolean	 ohm_conf_get_keys			(OhmConf	*conf,
-							 GSList		**list);
 gboolean	 ohm_conf_get_key			(OhmConf	*conf,
 							 const gchar	*key,
 							 gint		*value,
 							 GError		**error);
+void		 ohm_conf_keys_foreach			(OhmConf	*conf,
+							 OhmConfForeachFunc func,
+							 gpointer	user_data);
+
 gboolean	 ohm_conf_set_key_internal		(OhmConf	*conf,
 							 const gchar	*key,
 							 gint		 value,
-- 
1.5.3.GIT


--------------060201080106070404000602
Content-Type: text/x-patch;
 name="0002-Add-ohm_conf_keys_length-method.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="0002-Add-ohm_conf_keys_length-method.patch"



More information about the Ohm-devel mailing list