From ea6fd5037f677ccd7e1bfa9276e55c921ef9bde5 Mon Sep 17 00:00:00 2001
From: Danny Auble <da@llnl.gov>
Date: Mon, 2 Oct 2006 20:55:14 +0000
Subject: [PATCH] blocks sort of display correctly.

---
 src/sview/block_info.c | 223 +++++++++++++----------------------------
 src/sview/common.c     |   7 +-
 2 files changed, 76 insertions(+), 154 deletions(-)

diff --git a/src/sview/block_info.c b/src/sview/block_info.c
index ffbca7fe447..b8fa2892b3d 100644
--- a/src/sview/block_info.c
+++ b/src/sview/block_info.c
@@ -41,26 +41,28 @@ typedef struct {
 	enum connection_type bg_conn_type;
 	enum node_use_type bg_node_use;
 	rm_partition_state_t state;
-	int letter_num;
 	List nodelist;
 	int size;
 	uint16_t quarter;	
 	uint16_t nodecard;	
 	int node_cnt;	
+	int *bp_inx;            /* list index pairs into node_table for *nodes:
+				 * start_range_1, end_range_1,
+				 * start_range_2, .., -1  */
 	bool printed;
-
-} db2_block_info_t;
+	char *color;
+} sview_block_info_t;
 
 enum { 
 	SORTID_POS = POS_LOC,
-	SORTID_PARTITION, 
 	SORTID_BLOCK,
+	SORTID_NODES, 
+	SORTID_NODELIST, 
 	SORTID_STATE,
 	SORTID_USER,
 	SORTID_CONN,
 	SORTID_USE,
-	SORTID_NODES, 
-	SORTID_NODELIST, 
+	SORTID_PARTITION, 
 	SORTID_POINTER,
 	SORTID_UPDATED, 
 	SORTID_CNT
@@ -69,12 +71,13 @@ enum {
 static display_data_t display_data_block[] = {
 	{G_TYPE_INT, SORTID_POS, NULL, FALSE, -1, refresh_block,
 	 create_model_block, admin_edit_block},
-	{G_TYPE_STRING, SORTID_PARTITION, "Partition", 
-	 TRUE, -1, refresh_block,
-	 create_model_block, admin_edit_block},
 	{G_TYPE_STRING, SORTID_BLOCK, "Bluegene Block", 
 	 TRUE, -1, refresh_block,
 	 create_model_block, admin_edit_block},
+	{G_TYPE_STRING, SORTID_NODES, "Nodes", TRUE, -1, refresh_block,
+	 create_model_block, admin_edit_block},
+	{G_TYPE_STRING, SORTID_NODELIST, "BP List", TRUE, -1, refresh_block,
+	 create_model_block, admin_edit_block},
 	{G_TYPE_STRING, SORTID_STATE, "State", TRUE, -1, refresh_block,
 	 create_model_block, admin_edit_block},
 	{G_TYPE_STRING, SORTID_USER, "User", TRUE, -1, refresh_block,
@@ -84,9 +87,8 @@ static display_data_t display_data_block[] = {
 	 create_model_block, admin_edit_block},
 	{G_TYPE_STRING, SORTID_USE, "Node Use", TRUE, -1, refresh_block,
 	 create_model_block, admin_edit_block},
-	{G_TYPE_STRING, SORTID_NODES, "Nodes", TRUE, -1, refresh_block,
-	 create_model_block, admin_edit_block},
-	{G_TYPE_STRING, SORTID_NODELIST, "BP List", TRUE, -1, refresh_block,
+	{G_TYPE_STRING, SORTID_PARTITION, "Partition", 
+	 TRUE, -1, refresh_block,
 	 create_model_block, admin_edit_block},
 	{G_TYPE_POINTER, SORTID_POINTER, NULL, FALSE, -1, refresh_block,
 	 create_model_block, admin_edit_block},
@@ -108,78 +110,16 @@ static display_data_t *local_display_data = NULL;
 
 static char* _convert_conn_type(enum connection_type conn_type);
 static char* _convert_node_use(enum node_use_type node_use);
-static int _marknodes(db2_block_info_t *block_ptr, int count);
 static char *_part_state_str(rm_partition_state_t state);
 static void _block_list_del(void *object);
 static void _nodelist_del(void *object);
-static int _in_slurm_partition(List slurm_nodes, List bg_nodes);
+static int _in_slurm_partition(int *part_inx, int *block_inx);
 static int _make_nodelist(char *nodes, List nodelist);
-static void _append_block_record(db2_block_info_t *block_ptr,
+static void _append_block_record(sview_block_info_t *block_ptr,
 				GtkTreeStore *treestore, GtkTreeIter *iter, 
 				int line);
 
 
-static int _marknodes(db2_block_info_t *block_ptr, int count)
-{
-#ifdef HAVE_BG
-	int j=0;
-	int start[BA_SYSTEM_DIMENSIONS];
-	int end[BA_SYSTEM_DIMENSIONS];
-	int number = 0;
-	
-	block_ptr->letter_num = count;
-	while (block_ptr->nodes[j] != '\0') {
-		if ((block_ptr->nodes[j] == '['
-		     || block_ptr->nodes[j] == ',')
-		    && (block_ptr->nodes[j+8] == ']' 
-			|| block_ptr->nodes[j+8] == ',')
-		    && (block_ptr->nodes[j+4] == 'x'
-			|| block_ptr->nodes[j+4] == '-')) {
-			j++;
-			number = atoi(block_ptr->nodes + j);
-			start[X] = number / 100;
-			start[Y] = (number % 100) / 10;
-			start[Z] = (number % 10);
-			j += 4;
-			number = atoi(block_ptr->nodes + j);
-			end[X] = number / 100;
-			end[Y] = (number % 100) / 10;
-			end[Z] = (number % 10);
-			j += 3;
-			
-			/* if(block_ptr->state != RM_PARTITION_FREE)  */
-/* 				block_ptr->size += set_grid_bg(start, */
-/* 							       end, */
-/* 							       count, */
-/* 							       1); */
-/* 			else */
-/* 				block_ptr->size += set_grid_bg(start,  */
-/* 							       end,  */
-/* 							       count,  */
-/* 							       0); */
-			if(block_ptr->nodes[j] != ',')
-				break;
-			j--;
-		} else if((block_ptr->nodes[j] < 58 
-			   && block_ptr->nodes[j] > 47)) {
-					
-			number = atoi(block_ptr->nodes + j);
-			start[X] = number / 100;
-			start[Y] = (number % 100) / 10;
-			start[Z] = (number % 10);
-			j+=3;
-			/* block_ptr->size += set_grid_bg(start,  */
-/* 							start,  */
-/* 							count,  */
-/* 							0); */
-			if(block_ptr->nodes[j] != ',')
-				break;
-		}
-		j++;
-	}
-#endif
-	return SLURM_SUCCESS;
-}
 
 static char *_part_state_str(rm_partition_state_t state)
 {
@@ -210,7 +150,7 @@ static char *_part_state_str(rm_partition_state_t state)
 
 static void _block_list_del(void *object)
 {
-	db2_block_info_t *block_ptr = (db2_block_info_t *)object;
+	sview_block_info_t *block_ptr = (sview_block_info_t *)object;
 
 	if (block_ptr) {
 		xfree(block_ptr->bg_user_name);
@@ -232,39 +172,28 @@ static void _nodelist_del(void *object)
 	return;
 }
 
-static int _in_slurm_partition(List slurm_nodes, List bg_nodes)
+static int _in_slurm_partition(int *part_inx, int *bp_inx)
 {
-	ListIterator slurm_itr;
-	ListIterator bg_itr;
-	int *coord = NULL;
-	int *slurm_coord = NULL;
 	int found = 0;
-	
-	bg_itr = list_iterator_create(bg_nodes);
-	slurm_itr = list_iterator_create(slurm_nodes);
-	while ((coord = list_next(bg_itr)) != NULL) {
-		list_iterator_reset(slurm_itr);
+	int i=0, j=0;
+		
+	while(bp_inx[i] >= 0) {
+		j = 0;
 		found = 0;
-		while ((slurm_coord = list_next(slurm_itr)) != NULL) {
-			if((coord[X] == slurm_coord[X])
-			   && (coord[Y] == slurm_coord[Y])
-			   && (coord[Z] == slurm_coord[Z])) {
-				found=1;
+		while(part_inx[j] >= 0) {
+			if((bp_inx[i] >= part_inx[j])
+			   && bp_inx[i+1] <= part_inx[j+1]) {
+				found = 1;
 				break;
-			}			
-		}
-		if(!found) {
-			break;
+			}
+			j += 2;
 		}
+		if(!found)
+			return 0;
+		i += 2;
 	}
-	list_iterator_destroy(slurm_itr);
-	list_iterator_destroy(bg_itr);
-			
-	if(found)
-		return 1;
-	else
-		return 0;
 	
+	return 1;
 }
 
 static int _addto_nodelist(List nodelist, int *start, int *end)
@@ -369,7 +298,7 @@ static char* _convert_node_use(enum node_use_type node_use)
 	return "?";
 }
 
-static void _update_block_record(db2_block_info_t *block_ptr, 
+static void _update_block_record(sview_block_info_t *block_ptr, 
 				 GtkTreeStore *treestore, GtkTreeIter *iter)
 {
 	char *nodes = NULL;
@@ -411,7 +340,7 @@ static void _update_block_record(db2_block_info_t *block_ptr,
 	return;
 }
 	
-static void _append_block_record(db2_block_info_t *block_ptr,
+static void _append_block_record(sview_block_info_t *block_ptr,
 				 GtkTreeStore *treestore, GtkTreeIter *iter,
 				 int line)
 {
@@ -425,7 +354,7 @@ static void _update_info_block(List block_list,
 			       specific_info_t *spec_info)
 {
 	ListIterator itr;
-	db2_block_info_t *block_ptr = NULL;
+	sview_block_info_t *block_ptr = NULL;
 	GtkTreePath *path = gtk_tree_path_new_first();
 	GtkTreeModel *model = gtk_tree_view_get_model(tree_view);
 	GtkTreeIter iter;
@@ -456,7 +385,7 @@ static void _update_info_block(List block_list,
  	/* Report the BG Blocks */
 	
 	itr = list_iterator_create(block_list);
-	while ((block_ptr = (db2_block_info_t*) list_next(itr))) {
+	while ((block_ptr = (sview_block_info_t*) list_next(itr))) {
 		if(block_ptr->node_cnt == 0)
 			block_ptr->node_cnt = block_ptr->size;
 		if(!block_ptr->slurm_part_name)
@@ -559,13 +488,10 @@ static List _create_block_list(partition_info_msg_t *part_info_ptr,
 			       node_select_info_msg_t *node_select_ptr,
 			       int changed)
 {
-	int i, j, last_count = -1;
+	int i, j;
 	static List block_list = NULL;
-	ListIterator itr;
-	List nodelist = NULL;
 	partition_info_t part;
-	db2_block_info_t *block_ptr = NULL;
-	db2_block_info_t *found_block = NULL;
+	sview_block_info_t *block_ptr = NULL;
 	
 	if(!changed && block_list) {
 		return block_list;
@@ -580,7 +506,7 @@ static List _create_block_list(partition_info_msg_t *part_info_ptr,
 		return NULL;
 	}
 	for (i=0; i<node_select_ptr->record_count; i++) {
-		block_ptr = xmalloc(sizeof(db2_block_info_t));
+		block_ptr = xmalloc(sizeof(sview_block_info_t));
 			
 		block_ptr->bg_block_name 
 			= xstrdup(node_select_ptr->
@@ -588,7 +514,7 @@ static List _create_block_list(partition_info_msg_t *part_info_ptr,
 		block_ptr->nodes 
 			= xstrdup(node_select_ptr->bg_info_array[i].nodes);
 		block_ptr->nodelist = list_create(_nodelist_del);
-		_make_nodelist(block_ptr->nodes,block_ptr->nodelist);
+		_make_nodelist(block_ptr->nodes, block_ptr->nodelist);
 		
 		block_ptr->bg_user_name 
 			= xstrdup(node_select_ptr->
@@ -605,49 +531,23 @@ static List _create_block_list(partition_info_msg_t *part_info_ptr,
 			= node_select_ptr->bg_info_array[i].nodecard;
 		block_ptr->node_cnt 
 			= node_select_ptr->bg_info_array[i].node_cnt;
-	       
-		itr = list_iterator_create(block_list);
-		while ((found_block = (db2_block_info_t*)list_next(itr)) 
-		       != NULL) {
-			if(!strcmp(block_ptr->nodes, found_block->nodes)) {
-				block_ptr->letter_num = 
-					found_block->letter_num;
+		block_ptr->bp_inx 
+			= node_select_ptr->bg_info_array[i].bp_inx;
+		for(j = 0; j < part_info_ptr->record_count; j++) {
+			part = part_info_ptr->partition_array[j];
+			if(_in_slurm_partition(part.node_inx,
+					       block_ptr->bp_inx)) {
+				block_ptr->slurm_part_name 
+					= xstrdup(part.name);
 				break;
 			}
 		}
-		list_iterator_destroy(itr);
-
-		if(!found_block) {
-			last_count++;
-			_marknodes(block_ptr, last_count);
-		}
-		
 		if(block_ptr->bg_conn_type == SELECT_SMALL)
 			block_ptr->size = 0;
 
 		list_append(block_list, block_ptr);
 	}
-	for (i = 0; i < part_info_ptr->record_count; i++) {
-		j = 0;
-		part = part_info_ptr->partition_array[i];
-		
-		if (!part.nodes || (part.nodes[0] == '\0'))
-			continue;	/* empty partition */
-		nodelist = list_create(_nodelist_del);
-		_make_nodelist(part.nodes, nodelist);	
-		
-		itr = list_iterator_create(block_list);
-		while ((block_ptr = (db2_block_info_t*) list_next(itr))) {
-			if(_in_slurm_partition(nodelist,
-					       block_ptr->nodelist)) {
-				block_ptr->slurm_part_name 
-					= xstrdup(part.name);
-			}
-		}
-		list_iterator_destroy(itr);
-		list_destroy(nodelist);
-	}
-
+	
 	return block_list;
 }
 void _display_info_block(List block_list,
@@ -656,7 +556,7 @@ void _display_info_block(List block_list,
 	specific_info_t *spec_info = popup_win->spec_info;
 	/* char *name = (char *)spec_info->data; */
 /* 	int i, found = 0; */
-/* 	db2_block_info_t *block_ptr = NULL; */
+/* 	sview_block_info_t *block_ptr = NULL; */
 	char *info = NULL;
 	char *not_found = NULL;
 	GtkWidget *label = NULL;
@@ -675,7 +575,7 @@ void _display_info_block(List block_list,
 	/* this is here for if later we have more stats on a bluegene
 	   block */
 	/* itr = list_iterator_create(block_list); */
-/* 	while ((block_ptr = (db2_block_info_t*) list_next(itr))) { */
+/* 	while ((block_ptr = (sview_block_info_t*) list_next(itr))) { */
 /* 		if(!strcmp(block_ptr->bg_block_name, name)) { */
 /* 			if(!(info = slurm_sprint_block_info(&block_ptr, 0))) { */
 /* 				info = xmalloc(100); */
@@ -778,6 +678,9 @@ extern void get_info_block(GtkTable *table, display_data_t *display_data)
 	static GtkWidget *display_widget = NULL;
 	List block_list = NULL;
 	int changed = 1;
+	int i=0, j=0;
+	ListIterator itr = NULL;
+	sview_block_info_t *sview_block_info_ptr = NULL;
 
 	if(display_data)
 		local_display_data = display_data;
@@ -847,6 +750,24 @@ display_it:
 					changed);
 	if(!block_list)
 		return;
+	i=0;
+	/* set up the grid */
+	itr = list_iterator_create(block_list);
+	while ((sview_block_info_ptr = list_next(itr))) {
+		j=0;
+		while(sview_block_info_ptr->bp_inx[j] >= 0) {
+			sview_block_info_ptr->color =
+				change_grid_color(grid_button_list,
+						  sview_block_info_ptr->
+						  bp_inx[j],
+						  sview_block_info_ptr->
+						  bp_inx[j+1],
+						  i);
+			j += 2;
+		}
+		i++;
+	}
+	list_iterator_destroy(itr);
 
 	if(view == ERROR_VIEW && display_widget) {
 		gtk_widget_destroy(display_widget);
diff --git a/src/sview/common.c b/src/sview/common.c
index 1f15f3a9881..749f7c1aefe 100644
--- a/src/sview/common.c
+++ b/src/sview/common.c
@@ -127,7 +127,7 @@ static void _editing_started(GtkCellRenderer *cell,
 			     const gchar     *path,
 			     gpointer         data)
 {
-	//g_print("locking!!\n");
+	g_print("locking!!\n");
 	gdk_threads_leave();
 	g_static_mutex_lock(&sview_mutex);
 }
@@ -135,6 +135,7 @@ static void _editing_started(GtkCellRenderer *cell,
 static void _editing_canceled(GtkCellRenderer *cell,
 			       gpointer         data)
 {
+	g_print("unlocking!!\n");
 	g_static_mutex_unlock(&sview_mutex);
 }
 
@@ -189,6 +190,7 @@ static void _add_col_to_treeview(GtkTreeView *tree_view,
 	gtk_tree_view_column_pack_start(col, renderer, TRUE);
 	gtk_tree_view_column_add_attribute(col, renderer, 
 					   "text", display_data->id);
+	
 	gtk_tree_view_column_set_title(col, display_data->name);
 	gtk_tree_view_column_set_reorderable(col, true);
 	gtk_tree_view_column_set_resizable(col, true);
@@ -445,8 +447,6 @@ extern GtkTreeView *create_treeview(display_data_t *local)
 	g_signal_connect(G_OBJECT(tree_view), "button_press_event",
 			 G_CALLBACK(row_clicked),
 			 local);
-	
-
 	gtk_widget_show(GTK_WIDGET(tree_view));
 	
 	return tree_view;
@@ -505,6 +505,7 @@ extern GtkTreeStore *create_treestore(GtkTreeView *tree_view,
 		g_error("Can't great treestore.\n");
 		return NULL;
 	}
+	
 	gtk_tree_view_set_model(tree_view, GTK_TREE_MODEL(treestore));
 	for(i=1; i<count; i++) {
 		if(!display_data[i].show) 
-- 
GitLab