[syslog-ng] [PATCH (3.4) 1/2] value-pairs: Use a GTree for our internal scope.

Gergely Nagy algernon at balabit.hu
Fri Feb 10 17:35:21 CET 2012


Using a GTree instead of a GHashTable has the advantage of providing
faster access and a sorted key list, both of which are desired
features.

Signed-off-by: Gergely Nagy <algernon at balabit.hu>
---
 lib/value-pairs.c |   25 ++++++++++++-------------
 1 files changed, 12 insertions(+), 13 deletions(-)

diff --git a/lib/value-pairs.c b/lib/value-pairs.c
index 6ecd810..c5649ea 100644
--- a/lib/value-pairs.c
+++ b/lib/value-pairs.c
@@ -184,7 +184,7 @@ vp_pairs_foreach(gpointer key, gpointer value, gpointer user_data)
   ValuePairs *vp = ((gpointer *)user_data)[0];
   LogMessage *msg = ((gpointer *)user_data)[2];
   gint32 seq_num = GPOINTER_TO_INT (((gpointer *)user_data)[3]);
-  GHashTable *scope_set = ((gpointer *)user_data)[5];
+  GTree *scope_set = ((gpointer *)user_data)[5];
   ScratchBuffer *sb = scratch_buffer_acquire();
 
   log_template_format((LogTemplate *)value, msg, NULL, LTZ_LOCAL,
@@ -196,7 +196,7 @@ vp_pairs_foreach(gpointer key, gpointer value, gpointer user_data)
       return;
     }
 
-  g_hash_table_insert(scope_set, vp_transform_apply (vp, key), sb_string(sb)->str);
+  g_tree_insert(scope_set, vp_transform_apply(vp, key), sb_string(sb)->str);
   g_string_steal(sb_string(sb));
   scratch_buffer_release(sb);
 }
@@ -208,7 +208,7 @@ vp_msg_nvpairs_foreach(NVHandle handle, gchar *name,
                        gpointer user_data)
 {
   ValuePairs *vp = ((gpointer *)user_data)[0];
-  GHashTable *scope_set = ((gpointer *)user_data)[5];
+  GTree *scope_set = ((gpointer *)user_data)[5];
   gint j;
   gboolean inc = FALSE;
 
@@ -225,7 +225,7 @@ vp_msg_nvpairs_foreach(NVHandle handle, gchar *name,
       inc)
     {
       /* NOTE: the key is a borrowed reference in the hash, and value is freed */
-      g_hash_table_insert(scope_set, vp_transform_apply(vp, name), g_strndup(value, value_len));
+      g_tree_insert(scope_set, vp_transform_apply(vp, name), g_strndup(value, value_len));
     }
 
   return FALSE;
@@ -233,7 +233,7 @@ vp_msg_nvpairs_foreach(NVHandle handle, gchar *name,
 
 /* runs over a set of ValuePairSpec structs and merges them into the value-pair set */
 static void
-vp_merge_set(ValuePairs *vp, LogMessage *msg, gint32 seq_num, ValuePairSpec *set, GHashTable *dest)
+vp_merge_set(ValuePairs *vp, LogMessage *msg, gint32 seq_num, ValuePairSpec *set, GTree *dest)
 {
   gint i;
   ScratchBuffer *sb = scratch_buffer_acquire();
@@ -273,7 +273,7 @@ vp_merge_set(ValuePairs *vp, LogMessage *msg, gint32 seq_num, ValuePairSpec *set
       if (!sb_string(sb)->str[0])
 	continue;
 
-      g_hash_table_insert(dest, vp_transform_apply(vp, set[i].name), sb_string(sb)->str);
+      g_tree_insert(dest, vp_transform_apply(vp, set[i].name), sb_string(sb)->str);
       g_string_steal(sb_string(sb));
     }
   scratch_buffer_release(sb);
@@ -284,12 +284,11 @@ value_pairs_foreach (ValuePairs *vp, VPForeachFunc func,
 		     LogMessage *msg, gint32 seq_num, gpointer user_data)
 {
   gpointer args[] = { vp, func, msg, GINT_TO_POINTER (seq_num), user_data, NULL };
-  GHashTable *scope_set;
-
-  scope_set = g_hash_table_new_full(g_str_hash, g_str_equal,
-                                    (GDestroyNotify) g_free,
-				    (GDestroyNotify) g_free);
+  GTree *scope_set;
 
+  scope_set = g_tree_new_full((GCompareDataFunc)g_strcmp0, NULL,
+                              (GDestroyNotify)g_free,
+                              (GDestroyNotify)g_free);
   args[5] = scope_set;
 
   /*
@@ -316,9 +315,9 @@ value_pairs_foreach (ValuePairs *vp, VPForeachFunc func,
   g_hash_table_foreach(vp->vpairs, (GHFunc) vp_pairs_foreach, args);
 
   /* Aaand we run it through the callback! */
-  g_hash_table_foreach(scope_set, (GHFunc)func, user_data);
+  g_tree_foreach(scope_set, (GTraverseFunc)func, user_data);
 
-  g_hash_table_destroy(scope_set);
+  g_tree_destroy(scope_set);
 }
 
 
-- 
1.7.9




More information about the syslog-ng mailing list