Cacheing bonobo ui xml
- From: Alex Larsson <alexl redhat com>
- To: <gnome-components-list gnome org>, <nautilus-list eazel com>
- Subject: Cacheing bonobo ui xml
- Date: Tue, 21 Aug 2001 17:50:54 -0400 (EDT)
Here is a dirty patch that caches the result of bonobo_ui_util_new_ui so
that multiple parsing and fixups of the same file is avoided. This wastes
a bit memory (haven't measured how much) but speeds up e.g. opening a new
window in nautilus. I got about 9% speedup on open new window in nautilus.
Comments?
/ Alex
Index: bonobo-ui-util.c
===================================================================
RCS file: /cvs/gnome/bonobo/bonobo/bonobo-ui-util.c,v
retrieving revision 1.42
diff -u -p -r1.42 bonobo-ui-util.c
--- bonobo-ui-util.c 2001/04/15 16:12:32 1.42
+++ bonobo-ui-util.c 2001/08/21 21:42:20
@@ -1187,6 +1187,35 @@ bonobo_ui_util_fixup_icons (BonoboUINode
}
+
+typedef struct {
+ const char *file_name;
+ const char *app_datadir;
+ const char *app_name;
+ BonoboUINode *root;
+} BonoboUINodeCacheEntry;
+
+static guint
+node_hash (gconstpointer key)
+{
+ BonoboUINodeCacheEntry *entry = (BonoboUINodeCacheEntry *)key;
+ /* Ignore the app_datadir in the hash, since that
+ is also in file_name (always?) */
+ return g_str_hash (entry->file_name) ^ g_str_hash (entry->app_name);
+}
+
+static gint
+node_equal (gconstpointer a,
+ gconstpointer b)
+{
+ BonoboUINodeCacheEntry *entry_a = (BonoboUINodeCacheEntry *)a;
+ BonoboUINodeCacheEntry *entry_b = (BonoboUINodeCacheEntry *)b;
+
+ return (strcmp (entry_a->file_name, entry_b->file_name) == 0) &&
+ (strcmp (entry_a->app_name, entry_b->app_name) == 0) &&
+ (strcmp (entry_a->app_datadir, entry_b->app_datadir) == 0);
+}
+
/**
* bonobo_ui_util_new_ui:
* @component: The component help callback should be on
@@ -1205,10 +1234,26 @@ bonobo_ui_util_new_ui (BonoboUIComponent
const char *app_name)
{
BonoboUINode *node;
+ static GHashTable *loaded_node_cache = NULL;
+ BonoboUINodeCacheEntry entry, *cached;
g_return_val_if_fail (app_name != NULL, NULL);
g_return_val_if_fail (file_name != NULL, NULL);
+ if (loaded_node_cache == NULL) {
+ loaded_node_cache = g_hash_table_new (node_hash,
+ node_equal);
+ }
+
+ entry.file_name = file_name;
+ entry.app_datadir = app_datadir;
+ entry.app_name = app_name;
+
+ cached = g_hash_table_lookup (loaded_node_cache, &entry);
+ if (cached) {
+ return bonobo_ui_node_copy (cached->root, TRUE);
+ }
+
node = bonobo_ui_node_from_file (file_name);
bonobo_ui_node_strip (&node);
@@ -1218,6 +1263,15 @@ bonobo_ui_util_new_ui (BonoboUIComponent
bonobo_ui_util_fixup_help (component, node, app_datadir, app_name);
bonobo_ui_util_fixup_icons (node);
+
+ cached = g_new (BonoboUINodeCacheEntry, 1);
+ cached->file_name = g_strdup (file_name);
+ cached->app_datadir = g_strdup (app_datadir);
+ cached->app_name = g_strdup (app_name);
+ cached->root = bonobo_ui_node_copy (node, TRUE);
+
+ g_hash_table_insert (loaded_node_cache,
+ cached, cached);
return node;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]