From 0eddd2df2bcd7e1e392d6f7c7c3068c96fa2552a Mon Sep 17 00:00:00 2001
From: Danny Auble <da@llnl.gov>
Date: Thu, 2 Jul 2009 18:36:17 +0000
Subject: [PATCH] improve even more the performance of sview

---
 NEWS                   |  2 +-
 src/sview/block_info.c |  6 ++-
 src/sview/common.c     | 20 +++++++++
 src/sview/grid.c       | 93 ++++++++++++++++++++++++++++--------------
 src/sview/job_info.c   |  8 ++--
 src/sview/node_info.c  |  7 +++-
 src/sview/part_info.c  |  2 +
 src/sview/resv_info.c  |  6 ++-
 src/sview/sview.c      | 17 ++++----
 src/sview/sview.h      |  2 +
 10 files changed, 116 insertions(+), 47 deletions(-)

diff --git a/NEWS b/NEWS
index 7892dcc7684..105eaf78bde 100644
--- a/NEWS
+++ b/NEWS
@@ -27,7 +27,7 @@ documents those changes that are of interest to users and admins.
     logic would send SIGCONT, SIGTERM, wait KillWait seconds, SIGKILL.
  -- Create a spank_get_item() option that the SPANK cpuset plugin can use to
     discover the cpus that the select/cons_res plugin has allocated to a job.
- -- Improve sview performance on very large machines.
+ -- Improve sview performance (outrageously) on very large machines.
 
 * Changes in SLURM 2.1.0-pre1
 =============================
diff --git a/src/sview/block_info.c b/src/sview/block_info.c
index 0cfdf19ca80..688e15dd41f 100644
--- a/src/sview/block_info.c
+++ b/src/sview/block_info.c
@@ -580,7 +580,7 @@ need_refresh:
 				change_grid_color(
 					popup_win->grid_button_list,
 					block_ptr->bp_inx[j],
-					block_ptr->bp_inx[j+1], i, true,
+					block_ptr->bp_inx[j+1], i, false,
 					state);
 				j += 2;
 			}
@@ -902,13 +902,15 @@ display_it:
 						  bp_inx[j],
 						  sview_block_info_ptr->
 						  bp_inx[j+1],
-						  i, true, 0);
+						  i, false, 0);
 			j += 2;
 		}
 		i++;
 	}
 	list_iterator_destroy(itr);
 	change_grid_color(grid_button_list, -1, -1, MAKE_WHITE, true, 0);
+	gtk_widget_set_sensitive(GTK_WIDGET(main_grid_table), 0);
+	gtk_widget_set_sensitive(GTK_WIDGET(main_grid_table), 1);
 
 	if(view == ERROR_VIEW && display_widget) {
 		gtk_widget_destroy(display_widget);
diff --git a/src/sview/common.c b/src/sview/common.c
index 43f69091ac1..3b4d5d5174c 100644
--- a/src/sview/common.c
+++ b/src/sview/common.c
@@ -1229,3 +1229,23 @@ found:
 	
 	return;
 }
+
+/* I know what you are thinking, hey, why not use gtk_widget_modify_bg
+ * instead here?  Well, it turns out that takes an outrageous amount
+ * of relative time.  Here on only take around 40 microsecs where
+ * gtk_widget_modify_bg takes around 2500.  This isn't that big of a
+ * deal on most systems, but if you have like 10000 nodes this makes
+ * an outrageous difference.  You must follow this up by doing a
+ * gtk_widget_set_sensitive 0, and then 1 on the parent container to
+ * make the color stick.  
+ */
+extern void sview_widget_modify_bg(GtkWidget *widget, GtkStateType state,
+				   const GdkColor color)
+{
+	GtkRcStyle *rc_style = gtk_widget_get_modifier_style (widget);
+
+	widget->style->bg[state] = color;
+	rc_style->bg[state] = color;
+	rc_style->color_flags[state] |= GTK_RC_BG;
+	gtk_widget_reset_rc_styles (widget);
+}
diff --git a/src/sview/grid.c b/src/sview/grid.c
index 22e7410ec4f..3da54b05339 100644
--- a/src/sview/grid.c
+++ b/src/sview/grid.c
@@ -51,6 +51,7 @@ char *sview_colors[] = {"#0000FF", "#00FF00", "#00FFFF", "#FFFF00",
 			"#A020F0", "#8293ED", "#FFA500", "#FFC0CB",
 			"#8B6914", "#18A24E", "#F827FC", "#B8A40C"};
 char *blank_color = "#919191";
+char *white_color = "#FFFFFF";
 
 int sview_colors_cnt = 20;
 
@@ -202,11 +203,9 @@ void _put_button_as_down(grid_button_t *grid_button, int state)
 				 1, 1);
 	
 	gdk_color_parse("black", &color);
-	gtk_widget_modify_bg(grid_button->button, 
-			     GTK_STATE_NORMAL, &color);
-	gdk_color_parse("white", &color);
-	gtk_widget_modify_bg(grid_button->button, 
-			     GTK_STATE_PRELIGHT, &color);
+	sview_widget_modify_bg(grid_button->button, GTK_STATE_NORMAL, color);
+	gdk_color_parse(white_color, &color);
+	sview_widget_modify_bg(grid_button->button, GTK_STATE_PRELIGHT, color);
 	if(state == NODE_STATE_DRAIN)
 		image = gtk_image_new_from_stock(GTK_STOCK_DIALOG_ERROR,
 						 GTK_ICON_SIZE_SMALL_TOOLBAR);
@@ -221,7 +220,6 @@ void _put_button_as_down(grid_button_t *grid_button, int state)
 void _put_button_as_up(grid_button_t *grid_button)
 {
 	if(GTK_IS_BUTTON(grid_button->button)) {
-		//gtk_widget_set_sensitive (grid_button->button, TRUE);
 		return;
 	}
 	gtk_widget_destroy(grid_button->button);		
@@ -327,7 +325,7 @@ extern grid_button_t *create_grid_button_from_another(
 	} else if(color_inx == MAKE_BLACK) 
 		new_col = blank_color;
 	else 
-		new_col = "#FFFFFF";
+		new_col = white_color;
        			
 	send_grid_button = xmalloc(sizeof(grid_button_t));
 	memcpy(send_grid_button, grid_button, sizeof(grid_button_t));
@@ -342,8 +340,8 @@ extern grid_button_t *create_grid_button_from_another(
 		//gtk_widget_set_sensitive (send_grid_button->button, FALSE);
 		gdk_color_parse(new_col, &color);
 		send_grid_button->color = new_col;
-		gtk_widget_modify_bg(send_grid_button->button, 
-				     GTK_STATE_NORMAL, &color);
+		sview_widget_modify_bg(send_grid_button->button, 
+				       GTK_STATE_NORMAL, color);
 	} else if((color_inx >= 0) && node_base_state == NODE_STATE_DOWN) {
 		GtkWidget *image = gtk_image_new_from_stock(
 			GTK_STOCK_CANCEL,
@@ -353,11 +351,11 @@ extern grid_button_t *create_grid_button_from_another(
 			GTK_EVENT_BOX(send_grid_button->button),
 			FALSE);
 		gdk_color_parse("black", &color);
-		gtk_widget_modify_bg(send_grid_button->button, 
-				     GTK_STATE_NORMAL, &color);
+		sview_widget_modify_bg(send_grid_button->button, 
+				       GTK_STATE_NORMAL, color);
 		gdk_color_parse("white", &color);
-		gtk_widget_modify_bg(send_grid_button->button, 
-				     GTK_STATE_PRELIGHT, &color);
+		sview_widget_modify_bg(send_grid_button->button, 
+				     GTK_STATE_PRELIGHT, color);
 		gtk_container_add(
 			GTK_CONTAINER(send_grid_button->button),
 			image);
@@ -373,11 +371,11 @@ extern grid_button_t *create_grid_button_from_another(
 			GTK_EVENT_BOX(send_grid_button->button),
 			FALSE);
 		gdk_color_parse("black", &color);
-		gtk_widget_modify_bg(send_grid_button->button, 
-				     GTK_STATE_NORMAL, &color);
+		sview_widget_modify_bg(send_grid_button->button, 
+				       GTK_STATE_NORMAL, color);
 		gdk_color_parse("white", &color);
-		gtk_widget_modify_bg(send_grid_button->button, 
-				     GTK_STATE_PRELIGHT, &color);
+		sview_widget_modify_bg(send_grid_button->button, 
+				       GTK_STATE_PRELIGHT, color);
 		gtk_container_add(
 			GTK_CONTAINER(send_grid_button->button),
 			image);		
@@ -385,8 +383,8 @@ extern grid_button_t *create_grid_button_from_another(
 		send_grid_button->button = gtk_button_new();
 		send_grid_button->color = new_col;		
 		gdk_color_parse(new_col, &color);
-		gtk_widget_modify_bg(send_grid_button->button, 
-				     GTK_STATE_NORMAL, &color);
+		sview_widget_modify_bg(send_grid_button->button, 
+				       GTK_STATE_NORMAL, color);
 	}
 	gtk_widget_set_size_request(send_grid_button->button, 10, 10);
 	send_grid_button->tip = gtk_tooltips_new();
@@ -402,7 +400,7 @@ extern grid_button_t *create_grid_button_from_another(
 
 /* start == -1 for all */
 extern char *change_grid_color(List button_list, int start, int end,
-			       int color_inx, bool change_unused,
+			       int color_inx, bool only_change_unused,
 			       enum node_states state_override)
 {
 	ListIterator itr = NULL;
@@ -410,17 +408,21 @@ extern char *change_grid_color(List button_list, int start, int end,
 	uint16_t node_base_state;
 	GdkColor color;
 	char *new_col = NULL;
-
+	static GQuark quark_rc_style = 0;
+  
 	if(!button_list)
 		return NULL;
 
+	if(!quark_rc_style)
+		quark_rc_style = g_quark_from_static_string ("gtk-rc-style");
+
 	if(color_inx >= 0) {
 		color_inx %= sview_colors_cnt;
 		new_col = sview_colors[color_inx];
 	} else if(color_inx == MAKE_BLACK) 
 		new_col = blank_color;
 	else 
-		new_col = "#FFFFFF";
+		new_col = white_color;
 	
 	gdk_color_parse(new_col, &color);
 
@@ -432,17 +434,17 @@ extern char *change_grid_color(List button_list, int start, int end,
 			    ||  (grid_button->inx > end)) 
 				continue;
 		
-		if(change_unused && grid_button->used)
+		if(only_change_unused && grid_button->used)
 			continue;
-		
+
 		grid_button->used = true;
 		if(color_inx == MAKE_BLACK) {
 			if(grid_button->color_inx != color_inx) {
 				_put_button_as_inactive(grid_button);
 				grid_button->color = new_col;
 				grid_button->color_inx = color_inx;
-				gtk_widget_modify_bg(grid_button->button, 
-						     GTK_STATE_NORMAL, &color);
+				sview_widget_modify_bg(grid_button->button, 
+						       GTK_STATE_NORMAL, color);
 			}
 			
 			continue;
@@ -460,8 +462,36 @@ extern char *change_grid_color(List button_list, int start, int end,
 			_put_button_as_up(grid_button);
 			grid_button->color = new_col;
 			grid_button->color_inx = color_inx;
-			gtk_widget_modify_bg(grid_button->button,
-					     GTK_STATE_NORMAL, &color);
+			sview_widget_modify_bg(grid_button->button, 
+					       GTK_STATE_NORMAL, color);
+/* 			START_TIMER; */
+/* 			GtkRcStyle *rc_style = gtk_widget_get_modifier_style (grid_button->button); */
+/* 			END_TIMER; */
+/* 			g_print("%d 1 took %s\n", grid_button->inx, TIME_STR); */
+
+/* 			grid_button->button-> */
+/* 				style->bg[GTK_STATE_NORMAL] = color; */
+/* 			/\* grid_button->button-> *\/ */
+/* /\* 				style->style->flags[GTK_STATE_NORMAL] = color; *\/ */
+/* 			START_TIMER; */
+/* 			rc_style->bg[GTK_STATE_NORMAL] = color; */
+/* 			rc_style->color_flags[GTK_STATE_NORMAL] |= GTK_RC_BG; */
+/* 			/\* g_object_set_qdata (G_OBJECT(grid_button->button), *\/ */
+/* /\* 						 quark_rc_style, *\/ */
+/* /\* 					    rc_style); *\/ */
+/* 			END_TIMER; */
+/* 			g_print("%d 2 took %s\n", grid_button->inx, TIME_STR); */
+/* 			START_TIMER; */
+/* 			gtk_widget_reset_rc_styles (grid_button->button); */
+/* /\* 			gtk_widget_set_sensitive(grid_button->button, 0); *\/ */
+/* /\* 			gtk_widget_set_sensitive(grid_button->button, 1); *\/ */
+
+/* /\* 			gtk_widget_hide_all(grid_button->button); *\/ */
+/* /\* 			gtk_widget_show_all(grid_button->button); *\/ */
+/* /\* 			gtk_widget_modify_bg(grid_button->button, *\/ */
+/* /\* 					     GTK_STATE_NORMAL, &color); *\/ */
+/* 			END_TIMER; */
+/* 			g_print("%d 3 took %s\n", grid_button->inx, TIME_STR); */
 		}
 	}
 	list_iterator_destroy(itr);
@@ -811,7 +841,7 @@ extern int setup_grid_table(GtkTable *table, List button_list, List node_list)
 		g_print("setup_grid_table: no node_list given\n");
 		return SLURM_ERROR;
 	}
-	
+
 	gtk_table_resize(table, table_y, table_x);
 	itr = list_iterator_create(node_list);
 	while((sview_node_info_ptr = list_next(itr))) {
@@ -1006,6 +1036,9 @@ extern void post_setup_popup_grid_list(popup_info_t *popup_win)
 		}
 	}
 
-	change_grid_color(grid_button_list, -1, -1,
+	change_grid_color(popup_win->grid_button_list, -1, -1,
 			  MAKE_BLACK, true, NODE_STATE_IDLE);
+	gtk_widget_set_sensitive(GTK_WIDGET(popup_win->grid_table), 0);
+	gtk_widget_set_sensitive(GTK_WIDGET(popup_win->grid_table), 1);
+
 }
diff --git a/src/sview/job_info.c b/src/sview/job_info.c
index 3f28ed08406..2dd71d3ec4d 100644
--- a/src/sview/job_info.c
+++ b/src/sview/job_info.c
@@ -2331,7 +2331,7 @@ need_refresh:
 					popup_win->grid_button_list,
 					sview_job_info->job_ptr->node_inx[j],
 					sview_job_info->job_ptr->node_inx[j+1],
-					i, true, 0);
+					i, false, 0);
 			j += 2;
 		}
 		_layout_job_record(treeview, sview_job_info, update);
@@ -2351,7 +2351,7 @@ need_refresh:
 						step_ptr->node_inx[j],
 						step_ptr->
 						node_inx[j+1],
-						i, true, 0);
+						i, false, 0);
 					j += 2;
 				}
 				_layout_step_record(treeview, 
@@ -2769,13 +2769,15 @@ display_it:
 				change_grid_color(grid_button_list,
 						  job_ptr->node_inx[j],
 						  job_ptr->node_inx[j+1],
-						  i, true, 0);
+						  i, false, 0);
 			j += 2;
 		}
 		i++;
 	}
 	list_iterator_destroy(itr);
 	change_grid_color(grid_button_list, -1, -1, MAKE_WHITE, true, 0);
+	gtk_widget_set_sensitive(GTK_WIDGET(main_grid_table), 0);
+	gtk_widget_set_sensitive(GTK_WIDGET(main_grid_table), 1);
 
 	if(view == ERROR_VIEW && display_widget) {
 		gtk_widget_destroy(display_widget);
diff --git a/src/sview/node_info.c b/src/sview/node_info.c
index 295163555de..4b166f52095 100644
--- a/src/sview/node_info.c
+++ b/src/sview/node_info.c
@@ -922,10 +922,13 @@ display_it:
 	/* set up the grid */
 	itr = list_iterator_create(info_list);
 	while ((sview_node_info_ptr = list_next(itr))) {
-		change_grid_color(grid_button_list, i, i, i, true, 0);
+		change_grid_color(grid_button_list, i, i, i, false, 0);
 		i++;
 	}
 	list_iterator_destroy(itr);
+	change_grid_color(grid_button_list, -1, -1, MAKE_WHITE, true, 0);
+	gtk_widget_set_sensitive(GTK_WIDGET(main_grid_table), 0);
+	gtk_widget_set_sensitive(GTK_WIDGET(main_grid_table), 1);
 
 	if(view == ERROR_VIEW && display_widget) {
 		gtk_widget_destroy(display_widget);
@@ -1133,7 +1136,7 @@ display_it:
 		
 		list_push(send_info_list, sview_node_info_ptr);
 		change_grid_color(popup_win->grid_button_list,
-				  i, i, 0, true, 0);
+				  i, i, 0, false, 0);
 	}
 	list_iterator_destroy(itr);
 	post_setup_popup_grid_list(popup_win);
diff --git a/src/sview/part_info.c b/src/sview/part_info.c
index 4535593d01a..fcdff0518d0 100644
--- a/src/sview/part_info.c
+++ b/src/sview/part_info.c
@@ -1980,6 +1980,8 @@ display_it:
 	}
 	list_iterator_destroy(itr);
 	change_grid_color(grid_button_list, -1, -1, MAKE_WHITE, true, 0);
+	gtk_widget_set_sensitive(GTK_WIDGET(main_grid_table), 0);
+	gtk_widget_set_sensitive(GTK_WIDGET(main_grid_table), 1);
 		
 	if(view == ERROR_VIEW && display_widget) {
 		gtk_widget_destroy(display_widget);
diff --git a/src/sview/resv_info.c b/src/sview/resv_info.c
index 3b7e20085d2..cfc73843a13 100644
--- a/src/sview/resv_info.c
+++ b/src/sview/resv_info.c
@@ -747,7 +747,7 @@ need_refresh:
 				change_grid_color(
 					popup_win->grid_button_list,
 					resv_ptr->node_inx[j],
-					resv_ptr->node_inx[j+1], i, true, 0);
+					resv_ptr->node_inx[j+1], i, false, 0);
 				j += 2;
 			}
 			_layout_resv_record(treeview, sview_resv_info, update);
@@ -1004,13 +1004,15 @@ display_it:
 				change_grid_color(grid_button_list,
 						  resv_ptr->node_inx[j],
 						  resv_ptr->node_inx[j+1],
-						  i, true, 0);
+						  i, false, 0);
 			j += 2;
 		}
 		i++;
 	}
 	list_iterator_destroy(itr);
 	change_grid_color(grid_button_list, -1, -1, MAKE_WHITE, true, 0);
+	gtk_widget_set_sensitive(GTK_WIDGET(main_grid_table), 0);
+	gtk_widget_set_sensitive(GTK_WIDGET(main_grid_table), 1);
 	
 	if(view == ERROR_VIEW && display_widget) {
 		gtk_widget_destroy(display_widget);
diff --git a/src/sview/sview.c b/src/sview/sview.c
index 8be92f9b78b..b5f12db7230 100644
--- a/src/sview/sview.c
+++ b/src/sview/sview.c
@@ -119,7 +119,7 @@ void *_page_thr(void *arg)
 	GtkTable *table = page->table;
 	display_data_t *display_data = &main_display_data[num];
 	static int thread_count = 0;
-	DEF_TIMERS;
+/* 	DEF_TIMERS; */
 	xfree(page);
 	
 	if(!grid_init) {
@@ -143,7 +143,7 @@ void *_page_thr(void *arg)
 	gdk_flush();
 	gdk_threads_leave();
 	while(page_running[num]) {		
-		START_TIMER;
+/* 		START_TIMER; */
 		g_static_mutex_lock(&sview_mutex);
 		gdk_threads_enter();
 		sview_init_grid();
@@ -151,8 +151,8 @@ void *_page_thr(void *arg)
 		gdk_flush();
 		gdk_threads_leave();
 		g_static_mutex_unlock(&sview_mutex);
-		END_TIMER;
-//		g_print("got for initeration: %s\n", TIME_STR);
+/* 		END_TIMER; */
+/* 		g_print("got for initeration: %s\n", TIME_STR); */
 		sleep(global_sleep_time);
 		
 		gdk_threads_enter();
@@ -351,10 +351,13 @@ static gboolean _delete(GtkWidget *widget,
                         GtkWidget *event,
                         gpointer data)
 {
-	gtk_main_quit ();
-	list_destroy(popup_list);
 	fini = 1;
-
+	gtk_main_quit();
+	ba_fini();
+	if(grid_button_list)
+		list_destroy(grid_button_list);
+	if(popup_list)
+		list_destroy(popup_list);
 	return FALSE;
 }
 
diff --git a/src/sview/sview.h b/src/sview/sview.h
index b19e14eea3e..6bbec78d0d5 100644
--- a/src/sview/sview.h
+++ b/src/sview/sview.h
@@ -445,5 +445,7 @@ extern void add_display_treestore_line(int update,
 				       GtkTreeStore *treestore,
 				       GtkTreeIter *iter,
 				       const char *name, char *value);
+extern void sview_widget_modify_bg(GtkWidget *widget, GtkStateType state,
+				   const GdkColor color);
 
 #endif
-- 
GitLab