[geany/geany-plugins] 864206: debugger: stree: Don't maintain a table of thread row references

Colomban Wendling git-noreply at xxxxx
Sun Feb 7 03:43:24 UTC 2016


Branch:      refs/heads/master
Author:      Colomban Wendling <ban at herbesfolles.org>
Committer:   Colomban Wendling <ban at herbesfolles.org>
Date:        Sun, 07 Feb 2016 03:43:24 UTC
Commit:      86420621978d58d337e3b9abc3069966bf3959d7
             https://github.com/geany/geany-plugins/commit/86420621978d58d337e3b9abc3069966bf3959d7

Log Message:
-----------
debugger: stree: Don't maintain a table of thread row references

GtkTreeRowReferences are not free to maintain as they might get updated
whenever a row is inserted or removed, and it's unlikely there would be
a very large amount of threads requiring great scaling.

So drop the reference logic for a simple search in the existing threads
whenever we need to find one out, which doesn't happen that often
anyways.


Modified Paths:
--------------
    debugger/src/stree.c

Modified: debugger/src/stree.c
88 lines changed, 35 insertions(+), 53 deletions(-)
===================================================================
@@ -48,9 +48,6 @@ enum
    S_N_COLUMNS
 };
 
-/* hash table to keep thread nodes in the tree */
-static GHashTable *threads;
-
 /* active thread and frame */
 static glong active_thread_id = 0;
 static int active_frame_index = 0;
@@ -74,6 +71,27 @@ static GType frame_get_type (void);
 G_DEFINE_BOXED_TYPE(frame, frame, frame_ref, frame_unref)
 #define STREE_TYPE_FRAME (frame_get_type ())
 
+/* finds the iter for thread @thread_id */
+static gboolean find_thread_iter (gint thread_id, GtkTreeIter *iter)
+{
+	gboolean found = FALSE;
+
+	if (gtk_tree_model_get_iter_first(model, iter))
+	{
+		do
+		{
+			gint existing_thread_id;
+
+			gtk_tree_model_get(model, iter, S_THREAD_ID, &existing_thread_id, -1);
+			if (existing_thread_id == thread_id)
+				found = TRUE;
+		}
+		while (! found && gtk_tree_model_iter_next(model, iter));
+	}
+
+	return found;
+}
+
 /* 
  * frame arrow clicked callback
  */
@@ -82,10 +100,13 @@ static void on_frame_arrow_clicked(CellRendererFrameIcon *cell_renderer, gchar *
     GtkTreePath *new_active_frame = gtk_tree_path_new_from_string (path);
     if (gtk_tree_path_get_indices(new_active_frame)[1] != active_frame_index)
 	{
+		GtkTreeIter thread_iter;
 		GtkTreeIter iter;
+		GtkTreePath *old_active_frame;
+
+		find_thread_iter (active_thread_id, &thread_iter);
+		old_active_frame = gtk_tree_model_get_path (model, &thread_iter);
 
-		GtkTreeRowReference *reference = (GtkTreeRowReference*)g_hash_table_lookup(threads, (gpointer)active_thread_id);
-		GtkTreePath *old_active_frame = gtk_tree_row_reference_get_path(reference);
 		gtk_tree_path_append_index(old_active_frame, active_frame_index);
 
 		gtk_tree_model_get_iter(model, &iter, old_active_frame);
@@ -418,14 +439,6 @@ GtkWidget* stree_init(move_to_line_cb ml, select_frame_cb sf)
 	column = gtk_tree_view_column_new ();
 	gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
 
-	/* create threads hash table */
-	threads =  g_hash_table_new_full(
-		g_direct_hash,
-		g_direct_equal,
-		NULL,
-		(GDestroyNotify)gtk_tree_row_reference_free
-	);
-		
 	return tree;
 }
 
@@ -434,16 +447,13 @@ GtkWidget* stree_init(move_to_line_cb ml, select_frame_cb sf)
  */
 void stree_add(GList *frames)
 {
-	GList *item;
-	GtkTreeRowReference *reference = (GtkTreeRowReference*)g_hash_table_lookup(threads, (gpointer)active_thread_id);
 	GtkTreeIter thread_iter;
-	GtkTreePath *path = gtk_tree_row_reference_get_path(reference);
-	gtk_tree_model_get_iter(model, &thread_iter, path);
-	gtk_tree_path_free(path);
+	GList *item;
 
 	g_object_ref (model);
 	gtk_tree_view_set_model (GTK_TREE_VIEW (tree), NULL);
 
+	find_thread_iter (active_thread_id, &thread_iter);
 	/* prepending is a *lot* faster than appending, so prepend with a reversed data set */
 	for (item = g_list_last (frames); item; item = item->prev)
 	{
@@ -461,7 +471,6 @@ void stree_add(GList *frames)
 void stree_clear(void)
 {
 	gtk_tree_store_clear(store);
-	g_hash_table_remove_all(threads);
 }
 
 /*
@@ -469,17 +478,12 @@ void stree_clear(void)
  */
 void stree_select_first_frame(gboolean make_active)
 {
-	GtkTreeRowReference *reference;
 	GtkTreeIter thread_iter, frame_iter;
-	GtkTreePath *active_path;
 
 	gtk_tree_view_expand_all(GTK_TREE_VIEW(tree));
-	
-	reference = (GtkTreeRowReference*)g_hash_table_lookup(threads, (gpointer)active_thread_id);
-	active_path = gtk_tree_row_reference_get_path(reference);
-	gtk_tree_model_get_iter(model, &thread_iter, active_path);
-	gtk_tree_path_free(active_path);
-	if(gtk_tree_model_iter_children(model, &frame_iter, &thread_iter))
+
+	if (find_thread_iter (active_thread_id, &thread_iter) &&
+	    gtk_tree_model_iter_children(model, &frame_iter, &thread_iter))
 	{
 		GtkTreePath* path;
 
@@ -504,11 +508,6 @@ void stree_select_first_frame(gboolean make_active)
  */
 void stree_destroy(void)
 {
-	if (threads)
-	{
-		g_hash_table_destroy(threads);
-		threads = NULL;
-	}
 }
 
 /*
@@ -516,8 +515,6 @@ void stree_destroy(void)
  */
 void stree_add_thread(int thread_id)
 {
-	GtkTreePath *tpath;
-	GtkTreeRowReference *reference;
 	GtkTreeIter thread_iter, new_thread_iter;
 
 	if (gtk_tree_model_get_iter_first(model, &thread_iter))
@@ -553,11 +550,6 @@ void stree_add_thread(int thread_id)
 					S_FRAME, NULL,
 					S_THREAD_ID, thread_id,
 					-1);
-
-	tpath = gtk_tree_model_get_path(model, &new_thread_iter);
-	reference = gtk_tree_row_reference_new(model, tpath);
-	g_hash_table_insert(threads, (gpointer)(long)thread_id,(gpointer)reference);
-	gtk_tree_path_free(tpath);
 }
 
 /*
@@ -565,17 +557,10 @@ void stree_add_thread(int thread_id)
  */
 void stree_remove_thread(int thread_id)
 {
-	GtkTreeRowReference *reference = (GtkTreeRowReference*)g_hash_table_lookup(threads, (gpointer)(glong)thread_id);
-	GtkTreePath *tpath = gtk_tree_row_reference_get_path(reference);
-
 	GtkTreeIter iter;
-	gtk_tree_model_get_iter(model, &iter, tpath);
-
-	gtk_tree_store_remove(store, &iter);
 
-	g_hash_table_remove(threads, (gpointer)(glong)thread_id);
-
-	gtk_tree_path_free(tpath);
+	if (find_thread_iter (thread_id, &iter))
+		gtk_tree_store_remove(store, &iter);
 }
 
 /*
@@ -583,14 +568,11 @@ void stree_remove_thread(int thread_id)
  */
 void stree_remove_frames(void)
 {
-	GtkTreeRowReference *reference = (GtkTreeRowReference*)g_hash_table_lookup(threads, (gpointer)active_thread_id);
 	GtkTreeIter child;
 	GtkTreeIter thread_iter;
-	GtkTreePath *tpath = gtk_tree_row_reference_get_path(reference);
-	gtk_tree_model_get_iter(model, &thread_iter, tpath);
-	gtk_tree_path_free(tpath);
 
-	if (gtk_tree_model_iter_children(model, &child, &thread_iter))
+	if (find_thread_iter (active_thread_id, &thread_iter) &&
+	    gtk_tree_model_iter_children(model, &child, &thread_iter))
 	{
 		while(gtk_tree_store_remove(GTK_TREE_STORE(model), &child))
 			;



--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).


More information about the Plugins-Commits mailing list