/** * @brief * create_specific_nodepart - create a node partition with specific * nodes, rather than from a placement * set resource=value * * @param[in] policy - policy info * @param[in] name - the name of the node partition * @param[in] nodes - the nodes to create the placement set with * * @return node_partition * - the node partition * @NULL : on error */ node_partition * create_specific_nodepart(status *policy, char *name, node_info **nodes) { node_partition *np; int i, j; int cnt; if (name == NULL || nodes == NULL) return NULL; np = new_node_partition(); if (np == NULL) return NULL; cnt = count_array((void **) nodes); np->name = string_dup(name); np->def = NULL; np->res_val = string_dup("none"); np->rank = get_sched_rank(); np->ninfo_arr = malloc((cnt + 1) * sizeof(node_info*)); if (np->ninfo_arr == NULL) { log_err(errno, __func__, MEM_ERR_MSG); free_node_partition(np); return NULL; } j = 0; for (i = 0; i < cnt; i++) { if (!nodes[i]->is_stale) { np->ninfo_arr[j] = nodes[i]; j++; } } np->tot_nodes = j; np->ninfo_arr[np->tot_nodes] = NULL; if (node_partition_update(policy, np) == 0) { free_node_partition(np); return NULL; } return np; }
/** * @brief * free_node_partition_array - free an array of node_partitions * * @param[in] np_arr - node partition array to free * * @return nothing * */ void free_node_partition_array(node_partition **np_arr) { int i; if (np_arr == NULL) return; for (i = 0; np_arr[i] != NULL; i++) free_node_partition(np_arr[i]); free(np_arr); }
/** * @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); }
/** * @brief * dup_node_partition - duplicate a node_partition structure * * @param[in] onp - the node_partition structure to duplicate * @param[in] nsinfo - server for the new node partiton (the nodes are needed) * * @return duplicated node_partition * @retval NULL : on error * */ node_partition * dup_node_partition(node_partition *onp, server_info *nsinfo) { node_partition *nnp; if (onp == NULL) return NULL; if ((nnp = new_node_partition()) == NULL) return NULL; if (onp->name != NULL) nnp->name = string_dup(onp->name); if (onp->def != NULL) nnp->def = onp->def; if (onp->res_val != NULL) nnp->res_val = string_dup(onp->res_val); nnp->ok_break = onp->ok_break; nnp->excl = onp->excl; nnp->tot_nodes = onp->tot_nodes; nnp->free_nodes = onp->free_nodes; nnp->res = dup_resource_list(onp->res); #ifdef NAS /* localmod 049 */ nnp->ninfo_arr = copy_node_ptr_array(onp->ninfo_arr, nsinfo->nodes, nsinfo); #else nnp->ninfo_arr = copy_node_ptr_array(onp->ninfo_arr, nsinfo->nodes); #endif nnp->bkts = dup_node_bucket_array(onp->bkts, nsinfo); nnp->rank = onp->rank; /* validity check */ if (onp->name == NULL || onp->res_val == NULL || nnp->res == NULL || nnp->ninfo_arr == NULL) { free_node_partition(nnp); return NULL; } return nnp; }