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

---
 src/sview/resv_info.c | 86 +++++++++++++++++++++----------------------
 1 file changed, 42 insertions(+), 44 deletions(-)

diff --git a/src/sview/resv_info.c b/src/sview/resv_info.c
index 3e58b40964b..31a86f84fbf 100644
--- a/src/sview/resv_info.c
+++ b/src/sview/resv_info.c
@@ -38,6 +38,7 @@ typedef struct {
 	GtkTreeIter iter_ptr;
 	bool iter_set;
 	int pos;
+	char *resv_name;
 	reserve_info_t *resv_ptr;
 } sview_resv_info_t;
 
@@ -416,11 +417,19 @@ return_error:
 	return type;
 }
 
+static void _resv_info_free(sview_resv_info_t *sview_resv_info)
+{
+	if (sview_resv_info) {
+		xfree(sview_resv_info->resv_name);
+	}
+}
+
 static void _resv_info_list_del(void *object)
 {
 	sview_resv_info_t *sview_resv_info = (sview_resv_info_t *)object;
 
 	if (sview_resv_info) {
+		_resv_info_free(sview_resv_info);
 		xfree(sview_resv_info);
 	}
 }
@@ -665,7 +674,6 @@ static void _update_info_resv(List info_list,
 {
 	GtkTreeModel *model = gtk_tree_view_get_model(tree_view);
 	static GtkTreeModel *last_model = NULL;
-	reserve_info_t *resv_ptr = NULL;
 	char *name = NULL;
 	ListIterator itr = NULL;
 	sview_resv_info_t *sview_resv_info = NULL;
@@ -674,8 +682,6 @@ static void _update_info_resv(List info_list,
 
 	itr = list_iterator_create(info_list);
 	while ((sview_resv_info = (sview_resv_info_t*) list_next(itr))) {
-		resv_ptr = sview_resv_info->resv_ptr;
-
 		/* This means the tree_store changed (added new column
 		   or something). */
 		if (last_model != model)
@@ -684,7 +690,8 @@ static void _update_info_resv(List info_list,
 		if (sview_resv_info->iter_set) {
 			gtk_tree_model_get(model, &sview_resv_info->iter_ptr,
 					   SORTID_NAME, &name, -1);
-			if (strcmp(name, resv_ptr->name)) { /* Bad pointer */
+			if (strcmp(name, sview_resv_info->resv_name)) {
+				/* Bad pointer */
 				sview_resv_info->iter_set = false;
 				//g_print("bad resv iter pointer\n");
 			}
@@ -694,42 +701,9 @@ static void _update_info_resv(List info_list,
 			_update_resv_record(sview_resv_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_resv_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_resv_info->iter_ptr,
-						SORTID_NAME,
-						&name, -1);
-					if (!strcmp(name, resv_ptr->name)) {
-						/* update with new info */
-						g_free(name);
-						_update_resv_record(
-							sview_resv_info,
-							GTK_TREE_STORE(model));
-						sview_resv_info->iter_set = 1;
-						break;
-					}
-					g_free(name);
-				} while (gtk_tree_model_iter_next(
-						 model,
-						 &sview_resv_info->iter_ptr));
-			}
-
-			if (!sview_resv_info->iter_set) {
-				_append_resv_record(sview_resv_info,
-						    GTK_TREE_STORE(model));
-				sview_resv_info->iter_set = true;
-			}
-			gtk_tree_path_free(path);
+			_append_resv_record(sview_resv_info,
+					    GTK_TREE_STORE(model));
+			sview_resv_info->iter_set = true;
 		}
 	}
 	list_iterator_destroy(itr);
@@ -764,6 +738,8 @@ static int _sview_resv_sort_aval_dec(sview_resv_info_t* rec_a,
 static List _create_resv_info_list(reserve_info_msg_t *resv_info_ptr)
 {
 	static List info_list = NULL;
+	List last_list = NULL;
+	ListIterator last_list_itr = NULL;
 	int i = 0;
 	static reserve_info_msg_t *last_resv_info_ptr = NULL;
 	sview_resv_info_t *sview_resv_info_ptr = NULL;
@@ -775,19 +751,36 @@ static List _create_resv_info_list(reserve_info_msg_t *resv_info_ptr)
 	last_resv_info_ptr = resv_info_ptr;
 
 	if (info_list)
-		list_flush(info_list);
-	else
-		info_list = list_create(_resv_info_list_del);
+		last_list = info_list;
 
+	info_list = list_create(_resv_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<resv_info_ptr->record_count; i++) {
 		resv_ptr = &(resv_info_ptr->reservation_array[i]);
 
-		sview_resv_info_ptr = xmalloc(sizeof(sview_resv_info_t));
+		sview_resv_info_ptr = NULL;
+
+		if (last_list_itr) {
+			while ((sview_resv_info_ptr =
+				list_next(last_list_itr))) {
+				if (!strcmp(sview_resv_info_ptr->resv_name,
+					    resv_ptr->name)) {
+					list_remove(last_list_itr);
+					_resv_info_free(sview_resv_info_ptr);
+					break;
+				}
+			}
+			list_iterator_reset(last_list_itr);
+		}
+		if (!sview_resv_info_ptr)
+			sview_resv_info_ptr =
+				xmalloc(sizeof(sview_resv_info_t));
 		sview_resv_info_ptr->pos = i;
 		sview_resv_info_ptr->resv_ptr = resv_ptr;
 		sview_resv_info_ptr->color_inx = i % sview_colors_cnt;
@@ -797,6 +790,11 @@ static List _create_resv_info_list(reserve_info_msg_t *resv_info_ptr)
 	list_sort(info_list,
 		  (ListCmpF)_sview_resv_sort_aval_dec);
 
+	if (last_list) {
+		list_iterator_destroy(last_list_itr);
+		list_destroy(last_list);
+	}
+
 update_color:
 	return info_list;
 }
-- 
GitLab