[Xfce4-commits] <tumbler:master> Update cache with tumbler_registry_update_supported() only when needed.
Jannis Pohlmann
noreply at xfce.org
Wed Oct 21 11:52:01 CEST 2009
Updating branch refs/heads/master
to a7a1dd4292b87384d7edae6d3f9995df2668fab0 (commit)
from 610f0964b759a26944bca705dad5061f1fe0ba04 (commit)
commit a7a1dd4292b87384d7edae6d3f9995df2668fab0
Author: Jannis Pohlmann <jannis at xfce.org>
Date: Wed Oct 21 11:50:07 2009 +0200
Update cache with tumbler_registry_update_supported() only when needed.
We'll probably have to deal with a lot of specialized thumbnailers on
Maemo and a lot of thumbnailer plugins on the desktop, and since
tumbler_registry_update_supported() is VERY expensive, we should only
call it when necessary.
tumblerd/main.c | 3 +
tumblerd/tumbler-registry.c | 278 +++++++++++++++++++++----------------------
tumblerd/tumbler-registry.h | 1 +
3 files changed, 140 insertions(+), 142 deletions(-)
diff --git a/tumblerd/main.c b/tumblerd/main.c
index 59fa0cf..93ae340 100644
--- a/tumblerd/main.c
+++ b/tumblerd/main.c
@@ -131,6 +131,9 @@ main (int argc,
/* drop the reference on the provider factory */
g_object_unref (provider_factory);
+ /* update the URI schemes / MIME types supported information */
+ tumbler_registry_update_supported (registry);
+
/* try to load specialized thumbnailers and exit if that fails */
if (!tumbler_registry_load (registry, &error))
{
diff --git a/tumblerd/tumbler-registry.c b/tumblerd/tumbler-registry.c
index d2b76f9..ecc0450 100644
--- a/tumblerd/tumbler-registry.c
+++ b/tumblerd/tumbler-registry.c
@@ -199,9 +199,6 @@ tumbler_registry_unregister (TumblerThumbnailer *thumbnailer,
thumbnailer);
g_mutex_unlock (registry->mutex);
-
- /* update the cache of supported URI schemes and MIME types */
- tumbler_registry_update_supported_cache (registry);
}
@@ -281,142 +278,6 @@ static void tumbler_registry_list_free (gpointer data)
-static void
-free_pair (gpointer data)
-{
- g_slice_free1 (2 * sizeof (const gchar *), data);
-}
-
-
-
-static void
-tumbler_registry_update_supported_cache (TumblerRegistry *registry)
-{
- GHashTableIter iter;
- GHashTable *unique_pairs;
- GSList *used_strings = NULL;
- GList *thumbnailers;
- GList *lp;
- const gchar **pair;
- GString *pair_string;
- GStrv mime_types;
- GStrv uri_schemes;
- gint n;
- gint u;
-
- g_return_if_fail (TUMBLER_IS_REGISTRY (registry));
-
- g_mutex_lock (registry->mutex);
-
- /* free the old cache */
- g_strfreev (registry->uri_schemes);
- registry->uri_schemes = NULL;
- g_strfreev (registry->mime_types);
- registry->mime_types = NULL;
-
- /* get a list of all active thumbnailers */
- thumbnailers = tumbler_registry_get_thumbnailers_internal (registry);
-
- g_mutex_unlock (registry->mutex);
-
- /* abort if there are no thumbnailers */
- if (thumbnailers == NULL)
- return;
-
- /* create a hash table to collect unique URI scheme / MIME type pairs */
- unique_pairs = g_hash_table_new_full (g_str_hash, g_str_equal,
- (GDestroyNotify) g_free,
- (GDestroyNotify) free_pair);
-
- /* iterate over all of them */
- for (lp = thumbnailers; lp != NULL; lp = lp->next)
- {
- /* determine the MIME types & URI schemes supported by the current thumbnailer */
- mime_types = tumbler_thumbnailer_get_mime_types (lp->data);
- uri_schemes = tumbler_thumbnailer_get_uri_schemes (lp->data);
-
- /* insert all MIME types & URI schemes into the hash table */
- for (n = 0;
- mime_types != NULL && uri_schemes != NULL && mime_types[n] != NULL;
- ++n)
- {
- /* remember the MIME type so that we can later reuse it without copying */
- used_strings = g_slist_prepend (used_strings, mime_types[n]);
-
- for (u = 0; uri_schemes[u] != NULL; ++u)
- {
- /* remember the URI scheme for this pair so that we can later reuse it
- * without copying. Only remember it once (n==0) to avoid segmentation
- * faults when freeing the list */
- if (n == 0)
- used_strings = g_slist_prepend (used_strings, uri_schemes[u]);
-
- /* allocate a pair with the current URI scheme and MIME type */
- pair = g_slice_alloc (2 * sizeof (const gchar *));
-
- /* we can now reuse the strings */
- pair[0] = uri_schemes[u];
- pair[1] = mime_types[n];
-
- /* combine the two to a unique pair identifier */
- pair_string = g_string_new (pair[0]);
- g_string_append_c (pair_string, '-');
- g_string_append (pair_string, pair[1]);
-
- /* remember the pair in the hash table */
- g_hash_table_insert (unique_pairs, pair_string->str, pair);
-
- /* free the pair string */
- g_string_free (pair_string, FALSE);
- }
- }
-
- /* free MIME types & URI schemes array. Their contents are stored in
- * used_strings and are freed later */
- g_free (mime_types);
- g_free (uri_schemes);
- }
-
- /* relase the thumbnailer list */
- g_list_foreach (thumbnailers, (GFunc) g_object_unref, NULL);
- g_list_free (thumbnailers);
-
- n = g_hash_table_size (unique_pairs);
-
- g_mutex_lock (registry->mutex);
-
- /* allocate a string array for the URI scheme / MIME type pairs */
- registry->uri_schemes = g_new0 (gchar *, n+1);
- registry->mime_types = g_new0 (gchar *, n+1);
-
- /* insert all unique URI scheme / MIME type pairs into string arrays */
- n = 0;
- g_hash_table_iter_init (&iter, unique_pairs);
- while (g_hash_table_iter_next (&iter, NULL, (gpointer) &pair))
- {
- /* fill the cache arrays with copied values */
- registry->uri_schemes[n] = g_strdup (pair[0]);
- registry->mime_types[n] = g_strdup (pair[1]);
-
- ++n;
- }
-
- /* NULL-terminate the arrays */
- registry->uri_schemes[n] = NULL;
- registry->mime_types[n] = NULL;
-
- g_mutex_unlock (registry->mutex);
-
- /* destroy the hash table we used */
- g_hash_table_unref (unique_pairs);
-
- /* free all strings we used but haven't freed yet */
- g_slist_foreach (used_strings, (GFunc) g_free, NULL);
- g_slist_free (used_strings);
-}
-
-
-
static GList *
tumbler_registry_get_thumbnailers_internal (TumblerRegistry *registry)
{
@@ -545,9 +406,6 @@ tumbler_registry_add (TumblerRegistry *registry,
g_strfreev (hash_keys);
g_mutex_unlock (registry->mutex);
-
- /* update the cached URI schemes / MIME types */
- tumbler_registry_update_supported_cache (registry);
}
@@ -628,6 +486,142 @@ tumbler_registry_get_thumbnailer_array (TumblerRegistry *registry,
+static void
+free_pair (gpointer data)
+{
+ g_slice_free1 (2 * sizeof (const gchar *), data);
+}
+
+
+
+void
+tumbler_registry_update_supported (TumblerRegistry *registry)
+{
+ GHashTableIter iter;
+ GHashTable *unique_pairs;
+ GSList *used_strings = NULL;
+ GList *thumbnailers;
+ GList *lp;
+ const gchar **pair;
+ GString *pair_string;
+ GStrv mime_types;
+ GStrv uri_schemes;
+ gint n;
+ gint u;
+
+ g_return_if_fail (TUMBLER_IS_REGISTRY (registry));
+
+ g_mutex_lock (registry->mutex);
+
+ /* free the old cache */
+ g_strfreev (registry->uri_schemes);
+ registry->uri_schemes = NULL;
+ g_strfreev (registry->mime_types);
+ registry->mime_types = NULL;
+
+ /* get a list of all active thumbnailers */
+ thumbnailers = tumbler_registry_get_thumbnailers_internal (registry);
+
+ g_mutex_unlock (registry->mutex);
+
+ /* abort if there are no thumbnailers */
+ if (thumbnailers == NULL)
+ return;
+
+ /* create a hash table to collect unique URI scheme / MIME type pairs */
+ unique_pairs = g_hash_table_new_full (g_str_hash, g_str_equal,
+ (GDestroyNotify) g_free,
+ (GDestroyNotify) free_pair);
+
+ /* iterate over all of them */
+ for (lp = thumbnailers; lp != NULL; lp = lp->next)
+ {
+ /* determine the MIME types & URI schemes supported by the current thumbnailer */
+ mime_types = tumbler_thumbnailer_get_mime_types (lp->data);
+ uri_schemes = tumbler_thumbnailer_get_uri_schemes (lp->data);
+
+ /* insert all MIME types & URI schemes into the hash table */
+ for (n = 0;
+ mime_types != NULL && uri_schemes != NULL && mime_types[n] != NULL;
+ ++n)
+ {
+ /* remember the MIME type so that we can later reuse it without copying */
+ used_strings = g_slist_prepend (used_strings, mime_types[n]);
+
+ for (u = 0; uri_schemes[u] != NULL; ++u)
+ {
+ /* remember the URI scheme for this pair so that we can later reuse it
+ * without copying. Only remember it once (n==0) to avoid segmentation
+ * faults when freeing the list */
+ if (n == 0)
+ used_strings = g_slist_prepend (used_strings, uri_schemes[u]);
+
+ /* allocate a pair with the current URI scheme and MIME type */
+ pair = g_slice_alloc (2 * sizeof (const gchar *));
+
+ /* we can now reuse the strings */
+ pair[0] = uri_schemes[u];
+ pair[1] = mime_types[n];
+
+ /* combine the two to a unique pair identifier */
+ pair_string = g_string_new (pair[0]);
+ g_string_append_c (pair_string, '-');
+ g_string_append (pair_string, pair[1]);
+
+ /* remember the pair in the hash table */
+ g_hash_table_insert (unique_pairs, pair_string->str, pair);
+
+ /* free the pair string */
+ g_string_free (pair_string, FALSE);
+ }
+ }
+
+ /* free MIME types & URI schemes array. Their contents are stored in
+ * used_strings and are freed later */
+ g_free (mime_types);
+ g_free (uri_schemes);
+ }
+
+ /* relase the thumbnailer list */
+ g_list_foreach (thumbnailers, (GFunc) g_object_unref, NULL);
+ g_list_free (thumbnailers);
+
+ n = g_hash_table_size (unique_pairs);
+
+ g_mutex_lock (registry->mutex);
+
+ /* allocate a string array for the URI scheme / MIME type pairs */
+ registry->uri_schemes = g_new0 (gchar *, n+1);
+ registry->mime_types = g_new0 (gchar *, n+1);
+
+ /* insert all unique URI scheme / MIME type pairs into string arrays */
+ n = 0;
+ g_hash_table_iter_init (&iter, unique_pairs);
+ while (g_hash_table_iter_next (&iter, NULL, (gpointer) &pair))
+ {
+ /* fill the cache arrays with copied values */
+ registry->uri_schemes[n] = g_strdup (pair[0]);
+ registry->mime_types[n] = g_strdup (pair[1]);
+
+ ++n;
+ }
+
+ /* NULL-terminate the arrays */
+ registry->uri_schemes[n] = NULL;
+ registry->mime_types[n] = NULL;
+
+ g_mutex_unlock (registry->mutex);
+
+ /* destroy the hash table we used */
+ g_hash_table_unref (unique_pairs);
+
+ /* free all strings we used but haven't freed yet */
+ g_slist_foreach (used_strings, (GFunc) g_free, NULL);
+ g_slist_free (used_strings);
+}
+
+
+
void
tumbler_registry_get_supported (TumblerRegistry *registry,
const gchar *const **uri_schemes,
diff --git a/tumblerd/tumbler-registry.h b/tumblerd/tumbler-registry.h
index acac8c3..011fd04 100644
--- a/tumblerd/tumbler-registry.h
+++ b/tumblerd/tumbler-registry.h
@@ -47,6 +47,7 @@ TumblerThumbnailer **tumbler_registry_get_thumbnailer_array (TumblerRegistry
const GStrv uris,
const GStrv mime_hints,
gint *length) G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT;
+void tumbler_registry_update_supported (TumblerRegistry *registry);
void tumbler_registry_get_supported (TumblerRegistry *registry,
const gchar *const **uri_schemes,
const gchar *const **mime_types);
More information about the Xfce4-commits
mailing list