示例#1
0
/**
 * @brief
 * 		find a np_cache by the array of resource names
 *		and nodes which created it.  If the np_cache
 *		does not exist, create it and add it to the list
 *
 * @param[in]	policy	-	policy info
 * @param[in,out]	pnpc_arr	-	pointer to np_cache array -- if *npc_arr == NULL
 *		 	           				a np_cache will be created and it will be set
 *			           				Example: you pass &(sinfo->npc_arr)
 * @param[in]	resnames	-	the names used to create the pool of node parts
 * @param[in]	ninfo_arr	-	the node array used to create the pool of node_parts
 * @param[in]	sort_func	-	sort function to sort placement sets.
 *				  				sets are only sorted when they are created.
 *				  				If NULL is passed in, no sorting is done
 *
 * @return	np_cache *
 * @retval	found	: created np_cache
 * @retval 	NULL	: on error
 *
 */
np_cache *
find_alloc_np_cache(status *policy, np_cache ***pnpc_arr,
	char **resnames, node_info **ninfo_arr,
	int (*sort_func)(const void *, const void *))
{
	node_partition **nodepart = NULL;
	int num_parts;
	np_cache *npc = NULL;
	int error = 0;

	if (resnames == NULL || ninfo_arr == NULL || pnpc_arr == NULL)
		return NULL;

	npc = find_np_cache(*pnpc_arr, resnames, ninfo_arr);

	if (npc == NULL) {
		/* didn't find node partition cache, need to allocate and create */
		nodepart = create_node_partitions(policy, ninfo_arr, resnames,
			policy->only_explicit_psets ? NO_FLAGS : NP_CREATE_REST,
			&num_parts);
		if (nodepart != NULL) {
			if (sort_func != NULL)
				qsort(nodepart, num_parts, sizeof(node_partition *), sort_func);

			npc = new_np_cache();
			if (npc != NULL) {
				npc->ninfo_arr = ninfo_arr;
				npc->resnames = dup_string_array(resnames);
				npc->num_parts = num_parts;
				npc->nodepart = nodepart;
				if (npc->resnames == NULL || add_np_cache(pnpc_arr, npc) ==0) {
					free_np_cache(npc);
					error = 1;
				}
			}
			else {
				free_node_partition_array(nodepart);
				error = 1;
			}
		}
		else
			error = 1;
	}

	if (error)
		return NULL;

	return npc;
}
示例#2
0
/**
 * @brief
 *		free_np_cache - destructor
 *
 * @param[in,out]	npc_arr	-	np cashe array.
 */
void
free_np_cache(np_cache *npc)
{
	if (npc == NULL)
		return;

	if (npc->resnames != NULL)
		free_string_array(npc->resnames);

	if (npc->nodepart != NULL)
		free_node_partition_array(npc->nodepart);

	/* reference to an array of nodes, the owner will free */
	npc->ninfo_arr = NULL;

	free(npc);
}
示例#3
0
/**
 * @brief
 *		free_queue_info - free space used by a queue info struct
 *
 * @param[in,out]	qinfo	-	queue to free
 *
 * @return	nothing
 *
 */
void
free_queue_info(queue_info *qinfo)
{
	if (qinfo->name != NULL)
		free(qinfo->name);
	if (qinfo->qres != NULL)
		free_resource_list(qinfo->qres);
	if (qinfo->running_jobs != NULL)
		free(qinfo->running_jobs);
	if (qinfo->nodes != NULL)
		free(qinfo->nodes);
	if (qinfo->nodes_in_partition != NULL)
		free(qinfo->nodes_in_partition);
	if (qinfo->alljobcounts != NULL)
		free_counts_list(qinfo->alljobcounts);
	if (qinfo->group_counts != NULL)
		free_counts_list(qinfo->group_counts);
	if (qinfo->project_counts != NULL)
		free_counts_list(qinfo->project_counts);
	if (qinfo->user_counts != NULL)
		free_counts_list(qinfo->user_counts);
	if (qinfo->total_alljobcounts != NULL)
		free_counts_list(qinfo->total_alljobcounts);
	if (qinfo->total_group_counts != NULL)
		free_counts_list(qinfo->total_group_counts);
	if (qinfo->total_project_counts != NULL)
		free_counts_list(qinfo->total_project_counts);
	if (qinfo->total_user_counts != NULL)
		free_counts_list(qinfo->total_user_counts);
	if (qinfo->nodepart != NULL)
		free_node_partition_array(qinfo->nodepart);
	if (qinfo->allpart != NULL)
		free_node_partition(qinfo->allpart);
	if (qinfo->node_group_key != NULL)
		free_string_array(qinfo->node_group_key);

	if (qinfo->liminfo != NULL) {
		lim_free_liminfo(qinfo->liminfo);
		qinfo->liminfo = NULL;
	}
	if (qinfo->partition != NULL)
		free(qinfo->partition);

	free(qinfo);
}