/** * @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; }
/** * @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); }
/** * @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); }