[geany/geany] 3f7b88: Avoid unnecessary hash table for global tag filenames

Nick Treleaven git-noreply at xxxxx
Thu Jul 26 00:04:13 UTC 2012


Branch:      refs/heads/document-messages
Author:      Nick Treleaven <nick.treleaven at btinternet.com>
Committer:   Nick Treleaven <nick.treleaven at btinternet.com>
Date:        Thu, 26 Apr 2012 12:18:05
Commit:      3f7b888b32a46683f8d67902df4c5d45ddb11a0e
             https://github.com/geany/geany/commit/3f7b888b32a46683f8d67902df4c5d45ddb11a0e

Log Message:
-----------
Avoid unnecessary hash table for global tag filenames


Modified Paths:
--------------
    src/filetypes.c
    src/filetypesprivate.h
    src/symbols.c

Modified: src/filetypes.c
9 files changed, 6 insertions(+), 3 deletions(-)
===================================================================
@@ -1124,12 +1124,15 @@ static void filetype_free(gpointer data, G_GNUC_UNUSED gpointer user_data)
 	g_free(ft->ftdefcmds);
 	g_free(ft->execcmds);
 	g_free(ft->error_regex_string);
-	if (ft->priv->error_regex)
-		g_regex_unref(ft->priv->error_regex);
 	if (ft->icon)
 		g_object_unref(ft->icon);
-
 	g_strfreev(ft->pattern);
+
+	if (ft->priv->error_regex)
+		g_regex_unref(ft->priv->error_regex);
+	g_slist_foreach(ft->priv->tag_files, (GFunc) g_free, NULL);
+	g_slist_free(ft->priv->tag_files);
+
 	g_free(ft->priv);
 	g_free(ft);
 }


Modified: src/filetypesprivate.h
1 files changed, 1 insertions(+), 0 deletions(-)
===================================================================
@@ -34,6 +34,7 @@
 	gboolean	custom;
 	gint		symbol_list_sort_mode;
 	gboolean	xml_indent_tags; /* XML tag autoindentation, for HTML and XML filetypes */
+	GSList		*tag_files;
 }
 GeanyFiletypePrivate;
 


Modified: src/symbols.c
40 files changed, 14 insertions(+), 26 deletions(-)
===================================================================
@@ -53,6 +53,7 @@
 #include "ui_utils.h"
 #include "editor.h"
 #include "sciwrappers.h"
+#include "filetypesprivate.h"
 
 
 const guint TM_GLOBAL_TYPE_MASK =
@@ -1810,15 +1811,12 @@ void symbols_show_load_tags_dialog(void)
 }
 
 
-/* Fills a hash table with filetype keys that hold a linked list of filenames. */
-static GHashTable *get_tagfile_hash(const GSList *file_list)
+static void detect_tag_files(const GSList *file_list)
 {
 	const GSList *node;
-	GHashTable *hash = g_hash_table_new(NULL, NULL);
 
 	for (node = file_list; node != NULL; node = g_slist_next(node))
 	{
-		GList *fnames;
 		gchar *fname = node->data;
 		gchar *utf8_fname = utils_get_utf8_from_locale(fname);
 		GeanyFiletype *ft = detect_global_tags_filetype(utf8_fname);
@@ -1827,21 +1825,17 @@ static GHashTable *get_tagfile_hash(const GSList *file_list)
 
 		if (FILETYPE_ID(ft) != GEANY_FILETYPES_NONE)
 		{
-			fnames = g_hash_table_lookup(hash, ft);	/* may be NULL */
-			fnames = g_list_append(fnames, fname);
-			g_hash_table_insert(hash, ft, fnames);
+			ft->priv->tag_files = g_slist_append(ft->priv->tag_files, fname);
 		}
 		else
 			geany_debug("Unknown filetype for file '%s'.", fname);
 	}
-	return hash;
 }
 
 
-static GHashTable *init_user_tags(void)
+static void init_user_tags(void)
 {
 	GSList *file_list = NULL, *list = NULL;
-	GHashTable *lang_hash;
 	gchar *dir;
 
 	dir = g_build_filename(app->configdir, "tags", NULL);
@@ -1857,21 +1851,17 @@ static GHashTable *init_user_tags(void)
 	g_free(dir);
 
 	file_list = g_slist_concat(file_list, list);
-
-	lang_hash = get_tagfile_hash(file_list);
-	/* don't need to delete list contents because they are now used for hash contents */
+	detect_tag_files(file_list);
+	/* don't need to delete list contents because they are stored in ft->priv->tag_files */
 	g_slist_free(file_list);
-
-	return lang_hash;
 }
 
 
 static void load_user_tags(filetype_id ft_id)
 {
 	static guchar *tags_loaded = NULL;
-	static GHashTable *lang_hash = NULL;
-	GList *fnames;
-	const GList *node;
+	static gboolean init_tags = FALSE;
+	const GSList *node;
 	GeanyFiletype *ft = filetypes[ft_id];
 
 	g_return_if_fail(ft_id > 0);
@@ -1882,20 +1872,18 @@ static void load_user_tags(filetype_id ft_id)
 		return;
 	tags_loaded[ft_id] = TRUE;	/* prevent reloading */
 
-	if (lang_hash == NULL)
-		lang_hash = init_user_tags();
-
-	fnames = g_hash_table_lookup(lang_hash, ft);
+	if (!init_tags)
+	{
+		init_user_tags();
+		init_tags = TRUE;
+	}
 
-	for (node = fnames; node != NULL; node = g_list_next(node))
+	for (node = ft->priv->tag_files; node != NULL; node = g_slist_next(node))
 	{
 		const gchar *fname = node->data;
 
 		symbols_load_global_tags(fname, ft);
 	}
-	g_list_foreach(fnames, (GFunc) g_free, NULL);
-	g_list_free(fnames);
-	g_hash_table_remove(lang_hash, (gpointer) ft);
 }
 
 


@@ Diff output truncated at 100000 characters. @@


--------------
This E-Mail was brought to you by github_commit_mail.py (Source: TBD).



More information about the Commits mailing list