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