From 1f01910b4271d54fc5bc15a96d4f5516444c35ff Mon Sep 17 00:00:00 2001
From: Danny Auble <da@schedmd.com>
Date: Thu, 27 Jun 2013 16:43:01 -0700
Subject: [PATCH] sview - speed up logic for large numbers of partitions

---
 src/sview/part_info.c | 111 +++++++++++++++++++-----------------------
 1 file changed, 49 insertions(+), 62 deletions(-)

diff --git a/src/sview/part_info.c b/src/sview/part_info.c
index 2f8715bef3b..25fd52ad52c 100644
--- a/src/sview/part_info.c
+++ b/src/sview/part_info.c
@@ -57,6 +57,7 @@ typedef struct {
 	int color_inx;
 	GtkTreeIter iter_ptr;
 	bool iter_set;
+	char *part_name;
 	/* part_info contains partition, avail, max_time, job_size,
 	 * root, share, groups */
 	partition_info_t* part_ptr;
@@ -1371,7 +1372,6 @@ static void _update_info_part(List info_list,
 {
 	GtkTreeModel *model = gtk_tree_view_get_model(tree_view);
 	static GtkTreeModel *last_model = NULL;
-	partition_info_t *part_ptr = NULL;
 	char *name = NULL;
 	ListIterator itr = NULL;
 	sview_part_info_t *sview_part_info = NULL;
@@ -1380,7 +1380,6 @@ static void _update_info_part(List info_list,
 
 	itr = list_iterator_create(info_list);
 	while ((sview_part_info = (sview_part_info_t*) list_next(itr))) {
-		part_ptr = sview_part_info->part_ptr;
 		/* This means the tree_store changed (added new column
 		   or something). */
 		if (last_model != model)
@@ -1389,7 +1388,8 @@ static void _update_info_part(List info_list,
 		if (sview_part_info->iter_set) {
 			gtk_tree_model_get(model, &sview_part_info->iter_ptr,
 					   SORTID_NAME, &name, -1);
-			if (strcmp(name, part_ptr->name)) /* Bad pointer */
+			if (strcmp(name, sview_part_info->part_name))
+				/* Bad pointer */
 				sview_part_info->iter_set = false;
 			g_free(name);
 		}
@@ -1397,42 +1397,9 @@ static void _update_info_part(List info_list,
 			_update_part_record(sview_part_info,
 					    GTK_TREE_STORE(model));
 		else {
-			GtkTreePath *path = gtk_tree_path_new_first();
-
-			/* get the iter, or find out the list is empty
-			 * goto add */
-			if (gtk_tree_model_get_iter(
-				    model, &sview_part_info->iter_ptr, path)) {
-				do {
-					/* search for the jobid and
-					   check to see if it is in
-					   the list */
-					gtk_tree_model_get(
-						model,
-						&sview_part_info->iter_ptr,
-						SORTID_NAME,
-						&name, -1);
-					if (!strcmp(name, part_ptr->name)) {
-						/* update with new info */
-						g_free(name);
-						_update_part_record(
-							sview_part_info,
-							GTK_TREE_STORE(model));
-						sview_part_info->iter_set = 1;
-						break;
-					}
-					g_free(name);
-				} while (gtk_tree_model_iter_next(
-						 model,
-						 &sview_part_info->iter_ptr));
-			}
-
-			if (!sview_part_info->iter_set) {
-				_append_part_record(sview_part_info,
-						    GTK_TREE_STORE(model));
-				sview_part_info->iter_set = true;
-			}
-			gtk_tree_path_free(path);
+			_append_part_record(sview_part_info,
+					    GTK_TREE_STORE(model));
+			sview_part_info->iter_set = true;
 		}
 	}
 	list_iterator_destroy(itr);
@@ -1442,13 +1409,21 @@ static void _update_info_part(List info_list,
 	return;
 }
 
+static void _part_info_free(sview_part_info_t *sview_part_info)
+{
+	if (sview_part_info) {
+		xfree(sview_part_info->part_name);
+		if (sview_part_info->sub_list)
+			list_destroy(sview_part_info->sub_list);
+	}
+}
+
 static void _part_info_list_del(void *object)
 {
 	sview_part_info_t *sview_part_info = (sview_part_info_t *)object;
 
 	if (sview_part_info) {
-		if (sview_part_info->sub_list)
-			list_destroy(sview_part_info->sub_list);
+		_part_info_free(sview_part_info);
 		xfree(sview_part_info);
 	}
 }
@@ -1595,23 +1570,6 @@ static int _insert_sview_part_sub(sview_part_info_t *sview_part_info,
 	return SLURM_SUCCESS;
 }
 
-/*
- * _create_sview_part_info - create an sview_part_info record for
- *                           the given partition
- * part_ptr IN             - pointer to partition record to add
- * sview_part_info OUT     - ptr to an inited sview_part_info_t
- */
-static sview_part_info_t *_create_sview_part_info(partition_info_t* part_ptr)
-{
-	sview_part_info_t *sview_part_info =
-		xmalloc(sizeof(sview_part_info_t));
-
-
-	sview_part_info->part_ptr = part_ptr;
-	sview_part_info->sub_list = list_create(_destroy_part_sub);
-	return sview_part_info;
-}
-
 static int _sview_part_sort_aval_dec(sview_part_info_t* rec_a,
 				     sview_part_info_t* rec_b)
 {
@@ -1653,6 +1611,8 @@ static List _create_part_info_list(partition_info_msg_t *part_info_ptr,
 	partition_info_t *part_ptr = NULL;
 	static node_info_msg_t *last_node_info_ptr = NULL;
 	static partition_info_msg_t *last_part_info_ptr = NULL;
+	List last_list = NULL;
+	ListIterator last_list_itr = NULL;
 	node_info_t *node_ptr = NULL;
 	static List info_list = NULL;
 	int i, j2;
@@ -1667,14 +1627,16 @@ static List _create_part_info_list(partition_info_msg_t *part_info_ptr,
 	last_part_info_ptr = part_info_ptr;
 
 	if (info_list)
-		list_flush(info_list);
-	else
-		info_list = list_create(_part_info_list_del);
+		last_list = info_list;
+
+	info_list = list_create(_part_info_list_del);
 	if (!info_list) {
 		g_print("malloc error\n");
 		return NULL;
 	}
 
+	if (last_list)
+		last_list_itr = list_iterator_create(last_list);
 	for (i=0; i<part_info_ptr->record_count; i++) {
 		part_ptr = &(part_info_ptr->partition_array[i]);
 
@@ -1682,7 +1644,27 @@ static List _create_part_info_list(partition_info_msg_t *part_info_ptr,
 		if (!working_sview_config.show_hidden &&
 		    part_ptr->flags & PART_FLAG_HIDDEN)
 			continue;
-		sview_part_info = _create_sview_part_info(part_ptr);
+
+		sview_part_info = NULL;
+
+		if (last_list_itr) {
+			while ((sview_part_info =
+				list_next(last_list_itr))) {
+				if (!strcmp(sview_part_info->part_name,
+					    part_ptr->name)) {
+					list_remove(last_list_itr);
+					_part_info_free(sview_part_info);
+					break;
+				}
+			}
+			list_iterator_reset(last_list_itr);
+		}
+
+		if (!sview_part_info)
+			sview_part_info = xmalloc(sizeof(sview_part_info_t));
+		sview_part_info->part_name = xstrdup(part_ptr->name);
+		sview_part_info->part_ptr = part_ptr;
+		sview_part_info->sub_list = list_create(_destroy_part_sub);
 		sview_part_info->pos = i;
 		list_append(info_list, sview_part_info);
 		sview_part_info->color_inx = i % sview_colors_cnt;
@@ -1736,6 +1718,11 @@ static List _create_part_info_list(partition_info_msg_t *part_info_ptr,
 	}
 	list_sort(info_list, (ListCmpF)_sview_part_sort_aval_dec);
 
+	if (last_list) {
+		list_iterator_destroy(last_list_itr);
+		list_destroy(last_list);
+	}
+
 	return info_list;
 }
 
-- 
GitLab