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