Make g_datalist_get_data not look up the quark
authorAlexander Larsson <alexl@redhat.com>
Thu, 19 May 2011 19:51:49 +0000 (21:51 +0200)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 4 Jun 2011 01:11:26 +0000 (21:11 -0400)
Instead of converting the string to a quark and comparing quarks we
use the new lockless g_quark_to_string and just compare the quarks
in the datalist with the given string.

This means we avoid the global lock for string to quark. Additionally
most of the time the data list will be quite short, so the cost of
doing the sting comparisons is likely similar to that of the quark
hashtable lookup (which does at least one string comparison for a
successfull lookup).

https://bugzilla.gnome.org/show_bug.cgi?id=650458

glib/gdataset.c
glib/gdataset.h
glib/glib.symbols

index 661c30f3cd361980ce9006aa61abbf2969e95729..c2582b937229848a36706e30fc5c8683f2ae88b5 100644 (file)
@@ -776,16 +776,6 @@ g_dataset_id_get_data (gconstpointer  dataset_location,
  *
  * Retrieves the data element corresponding to @key_id.
  **/
-/**
- * g_datalist_get_data:
- * @dl: a datalist.
- * @k: the string identifying a data element.
- * @Returns: the data element, or %NULL if it is not found.
- *
- * Gets a data element, using its string identifer. This is slower than
- * g_datalist_id_get_data() because the string is first converted to a
- * #GQuark.
- **/
 gpointer
 g_datalist_id_get_data (GData   **datalist,
                        GQuark     key_id)
@@ -822,6 +812,48 @@ g_datalist_id_get_data (GData       **datalist,
   return res;
 }
 
+/**
+ * g_datalist_get_data:
+ * @dl: a datalist.
+ * @k: the string identifying a data element.
+ * @Returns: the data element, or %NULL if it is not found.
+ *
+ * Gets a data element, using its string identifer. This is slower than
+ * g_datalist_id_get_data() because it compares strings.
+ **/
+gpointer
+g_datalist_get_data (GData      **datalist,
+                    const gchar *key)
+{
+  gpointer res = NULL;
+  GData *d;
+  GDataElt *data, *data_end;
+
+  g_return_val_if_fail (datalist != NULL, NULL);
+
+  g_datalist_lock (datalist);
+
+  d = G_DATALIST_GET_POINTER (datalist);
+  if (d)
+    {
+      data = d->data;
+      data_end = data + d->len;
+      while (data < data_end)
+       {
+         if (strcmp (g_quark_to_string (data->key), key) == 0)
+           {
+             res = data->data;
+             break;
+           }
+         data++;
+       }
+    }
+
+  g_datalist_unlock (datalist);
+
+  return res;
+}
+
 /**
  * GDataForeachFunc:
  * @key_id: the #GQuark id to identifying the data element.
index 2733ffb0335524db02c62c170b0f041f65f45e50..4451c38b427be6f40d26c7249340e1687288bc09 100644 (file)
@@ -76,8 +76,6 @@ guint    g_datalist_get_flags           (GData            **datalist);
      g_datalist_id_set_data_full ((dl), (q), (d), NULL)
 #define   g_datalist_id_remove_data(dl, q)      \
      g_datalist_id_set_data ((dl), (q), NULL)
-#define   g_datalist_get_data(dl, k)            \
-     (g_datalist_id_get_data ((dl), g_quark_try_string (k)))
 #define   g_datalist_set_data_full(dl, k, d, f) \
      g_datalist_id_set_data_full ((dl), g_quark_from_string (k), (d), (f))
 #define   g_datalist_remove_no_notify(dl, k)    \
@@ -93,6 +91,8 @@ guint    g_datalist_get_flags           (GData            **datalist);
 void      g_dataset_destroy             (gconstpointer    dataset_location);
 gpointer  g_dataset_id_get_data         (gconstpointer    dataset_location,
                                          GQuark           key_id);
+gpointer  g_datalist_get_data            (GData         **datalist,
+                                         const gchar *key);
 void      g_dataset_id_set_data_full    (gconstpointer    dataset_location,
                                          GQuark           key_id,
                                          gpointer         data,
index d38450d3c2ce5f0a605025781a0fab31e1681268..d8a18b9f9ae5390cee1499cfcc4c98ce8954d22a 100644 (file)
@@ -184,6 +184,7 @@ g_filename_to_utf8_utf8
 g_uri_list_extract_uris
 g_datalist_clear
 g_datalist_foreach
+g_datalist_get_data
 g_datalist_get_flags
 g_datalist_id_get_data
 g_datalist_id_remove_no_notify