diff --git a/src/sview/front_end_info.c b/src/sview/front_end_info.c index 01b00b161447e08d85928a597b6f857fd0762e76..e9eed6042f9f0f2b8abbab745c1b5dc148bb2cdd 100644 --- a/src/sview/front_end_info.c +++ b/src/sview/front_end_info.c @@ -36,9 +36,13 @@ /* Collection of data for printing reports. Like data is combined here */ typedef struct { int color_inx; + char *front_end_name; front_end_info_t *front_end_ptr; + GtkTreeIter iter_ptr; + bool iter_set; char *boot_time; int node_inx[3]; + int pos; char *reason; char *slurmd_start_time; char *state; @@ -68,6 +72,7 @@ enum { SORTID_REASON, SORTID_SLURMD_START_TIME, SORTID_STATE, + SORTID_UPDATED, SORTID_CNT }; @@ -109,6 +114,8 @@ static display_data_t display_data_front_end[] = { refresh_front_end, create_model_front_end, admin_edit_front_end}, {G_TYPE_POINTER, SORTID_NODE_INX, NULL, FALSE, EDIT_NONE, refresh_front_end, create_model_front_end, admin_edit_front_end}, + {G_TYPE_INT, SORTID_UPDATED, NULL, FALSE, EDIT_NONE, + refresh_resv, create_model_resv, admin_edit_resv}, {G_TYPE_NONE, -1, NULL, FALSE, EDIT_NONE} }; @@ -132,16 +139,23 @@ static void _admin_front_end(GtkTreeModel *model, GtkTreeIter *iter, char *type, static void _process_each_front_end(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter*iter, gpointer userdata); -static void _front_end_info_list_del(void *object) +static void _front_end_info_free(sview_front_end_info_t *sview_front_end_info) { - sview_front_end_info_t *sview_front_end_info; - - sview_front_end_info = (sview_front_end_info_t *)object; if (sview_front_end_info) { xfree(sview_front_end_info->boot_time); xfree(sview_front_end_info->reason); xfree(sview_front_end_info->slurmd_start_time); xfree(sview_front_end_info->state); + } +} + +static void _front_end_info_list_del(void *object) +{ + sview_front_end_info_t *sview_front_end_info; + + sview_front_end_info = (sview_front_end_info_t *)object; + if (sview_front_end_info) { + _front_end_info_free(sview_front_end_info); xfree(sview_front_end_info); } } @@ -210,15 +224,14 @@ static void _layout_front_end_record(GtkTreeView *treeview, static void _update_front_end_record( sview_front_end_info_t *sview_front_end_info_ptr, - GtkTreeStore *treestore, - GtkTreeIter *iter) + GtkTreeStore *treestore) { front_end_info_t *front_end_ptr; front_end_ptr = sview_front_end_info_ptr->front_end_ptr; /* Combining these records provides a slight performance improvement */ - gtk_tree_store_set(treestore, iter, + gtk_tree_store_set(treestore, &sview_front_end_info_ptr->iter_ptr, SORTID_ALLOW_GROUPS, front_end_ptr->allow_groups, SORTID_ALLOW_USERS, front_end_ptr->allow_users, SORTID_BOOT_TIME, @@ -236,6 +249,7 @@ static void _update_front_end_record( SORTID_SLURMD_START_TIME, sview_front_end_info_ptr->slurmd_start_time, SORTID_STATE, sview_front_end_info_ptr->state, + SORTID_UPDATED, 1, -1); return; @@ -243,77 +257,58 @@ static void _update_front_end_record( static void _append_front_end_record( sview_front_end_info_t *sview_front_end_info_ptr, - GtkTreeStore *treestore, GtkTreeIter *iter, - int line) + GtkTreeStore *treestore) { - gtk_tree_store_append(treestore, iter, NULL); - gtk_tree_store_set(treestore, iter, SORTID_POS, line, -1); - _update_front_end_record(sview_front_end_info_ptr, treestore, iter); + gtk_tree_store_append(treestore, &sview_front_end_info_ptr->iter_ptr, + NULL); + gtk_tree_store_set(treestore, &sview_front_end_info_ptr->iter_ptr, + SORTID_POS, sview_front_end_info_ptr->pos, -1); + _update_front_end_record(sview_front_end_info_ptr, treestore); } static void _update_info_front_end(List info_list, GtkTreeView *tree_view) { - GtkTreePath *path = gtk_tree_path_new_first(); GtkTreeModel *model = gtk_tree_view_get_model(tree_view); - GtkTreeIter iter; - front_end_info_t *front_end_ptr = NULL; - int line = 0; - char *host = NULL, *front_end_name = NULL; + static GtkTreeModel *last_model = NULL; + char *name; ListIterator itr = NULL; sview_front_end_info_t *sview_front_end_info = NULL; - /* get the iter, or find out the list is empty goto add */ - if (gtk_tree_model_get_iter(model, &iter, path)) { - /* make sure all the reserves are still here */ - while (1) { - if (!gtk_tree_model_iter_next(model, &iter)) { - break; - } - } - } + set_for_update(model, SORTID_UPDATED); itr = list_iterator_create(info_list); while ((sview_front_end_info = list_next(itr))) { - front_end_ptr = sview_front_end_info->front_end_ptr; - /* get the iter, or find out the list is empty goto add */ - if (!gtk_tree_model_get_iter(model, &iter, path)) { - goto adding; - } - line = 0; - while (1) { - /* search for the jobid and check to see if - it is in the list */ - gtk_tree_model_get(model, &iter, SORTID_NAME, - &front_end_name, -1); - if (!strcmp(front_end_name, front_end_ptr->name)) { - /* update with new info */ - g_free(front_end_name); - _update_front_end_record(sview_front_end_info, - GTK_TREE_STORE(model), - &iter); - goto found; - } - g_free(front_end_name); - - line++; - if (!gtk_tree_model_iter_next(model, &iter)) { - break; + /* This means the tree_store changed (added new column + or something). */ + if (last_model != model) + sview_front_end_info->iter_set = false; + + if (sview_front_end_info->iter_set) { + gtk_tree_model_get(model, + &sview_front_end_info->iter_ptr, + SORTID_NAME, &name, -1); + if (strcmp(name, + sview_front_end_info->front_end_name)) { + /* Bad pointer */ + sview_front_end_info->iter_set = false; + //g_print("bad front_end iter pointer\n"); } + g_free(name); + } + if (sview_front_end_info->iter_set) + _update_front_end_record(sview_front_end_info, + GTK_TREE_STORE(model)); + else { + _append_front_end_record(sview_front_end_info, + GTK_TREE_STORE(model)); + sview_front_end_info->iter_set = true; } - adding: - _append_front_end_record(sview_front_end_info, - GTK_TREE_STORE(model), - &iter, line); - found: - ; } list_iterator_destroy(itr); - if (host) - free(host); - gtk_tree_path_free(path); - - return; + /* remove all old front_ends */ + remove_old(model, SORTID_UPDATED); + last_model = model; } static List _create_front_end_info_list( @@ -322,6 +317,8 @@ static List _create_front_end_info_list( char *upper = NULL; char user[32], time_str[32]; static List info_list = NULL; + List last_list = NULL; + ListIterator last_list_itr = NULL; int i = 0; sview_front_end_info_t *sview_front_end_info_ptr = NULL; front_end_info_t *front_end_ptr = NULL; @@ -330,19 +327,40 @@ static List _create_front_end_info_list( goto update_color; if (info_list) - list_flush(info_list); - else - info_list = list_create(_front_end_info_list_del); + last_list = info_list; + info_list = list_create(_front_end_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 < front_end_info_ptr->record_count; i++) { front_end_ptr = &(front_end_info_ptr->front_end_array[i]); - sview_front_end_info_ptr = - xmalloc(sizeof(sview_front_end_info_t)); + + sview_front_end_info_ptr = NULL; + + if (last_list_itr) { + while ((sview_front_end_info_ptr = + list_next(last_list_itr))) { + if (!strcmp(sview_front_end_info_ptr-> + front_end_name, + front_end_ptr->name)) { + list_remove(last_list_itr); + _front_end_info_free( + sview_front_end_info_ptr); + break; + } + } + list_iterator_reset(last_list_itr); + } + if (!sview_front_end_info_ptr) + sview_front_end_info_ptr = + xmalloc(sizeof(sview_front_end_info_t)); + sview_front_end_info_ptr->pos = i; + sview_front_end_info_ptr->front_end_name = front_end_ptr->name; sview_front_end_info_ptr->front_end_ptr = front_end_ptr; sview_front_end_info_ptr->color_inx = i % sview_colors_cnt; if (g_node_info_ptr) { @@ -390,6 +408,11 @@ static List _create_front_end_info_list( list_append(info_list, sview_front_end_info_ptr); } + if (last_list) { + list_iterator_destroy(last_list_itr); + list_destroy(last_list); + } + update_color: return info_list; }