/* * Copyright © 2013-2014 University of Wisconsin-La Crosse. * All rights reserved. * Copyright © 2013 Cisco Systems, Inc. All rights reserved. * Copyright © 2015-2017 Inria. All rights reserved. * * $COPYRIGHT$ * * Additional copyrights may follow * See COPYING in top-level directory. * * $HEADER$ */ #define _GNU_SOURCE /* See feature_test_macros(7) */ #include #include #include #include static UT_icd node_physical_links_icd = { sizeof(netloc_physical_link_t *), NULL, NULL, NULL }; static UT_icd node_physical_nodes_icd = { sizeof(netloc_node_t *), NULL, NULL, NULL }; static UT_icd node_partitions_icd = { sizeof(int), NULL, NULL, NULL }; static int node_or_subnode_destruct(netloc_node_t * node, int is_node); netloc_node_t * netloc_node_construct(void) { netloc_node_t *node = NULL; node = (netloc_node_t*)malloc(sizeof(netloc_node_t)); if (NULL == node) { return NULL; } node->physical_id[0] = '\0'; node->logical_id = -1; node->type = NETLOC_NODE_TYPE_INVALID; utarray_new(node->physical_links, &node_physical_links_icd); node->description = NULL; node->userdata = NULL; node->edges = NULL; utarray_new(node->subnodes, &node_physical_nodes_icd); node->paths = NULL; node->hostname = NULL; utarray_new(node->partitions, &node_partitions_icd); node->hwlocTopo = NULL; node->hwlocTopoIdx = -1; return node; } int netloc_node_destruct(netloc_node_t * node) { return node_or_subnode_destruct(node, 1); } static int node_or_subnode_destruct(netloc_node_t * node, int is_node) { utarray_free(node->physical_links); /* Description */ free(node->description); /* Edges */ netloc_edge_t *edge, *edge_tmp; HASH_ITER(hh, node->edges, edge, edge_tmp) { HASH_DEL(node->edges, edge); /* delete; edge advances to next */ netloc_edge_destruct(edge); } /* Subnodes */ for (unsigned int n = 0; n < utarray_len(node->subnodes); n++) { netloc_node_t *subnode = *(netloc_node_t **) utarray_eltptr(node->subnodes, n); node_or_subnode_destruct(subnode, 0); } utarray_free(node->subnodes); /* Paths */ netloc_path_t *path, *path_tmp; HASH_ITER(hh, node->paths, path, path_tmp) { HASH_DEL(node->paths, path); /* delete; path advances to next */ netloc_path_destruct(path); } /* Hostname */ free(node->hostname); /* Partitions */ utarray_free(node->partitions); /* hwlocTopo: nothing to do beacause the pointer is stored also in the topology */ free(node); return NETLOC_SUCCESS; } char *netloc_node_pretty_print(netloc_node_t* node) { char * str = NULL; asprintf(&str, " [%23s]/[%d] -- %s (%d links)", node->physical_id, node->logical_id, node->description, utarray_len(node->physical_links)); return str; } int netloc_node_is_in_partition(netloc_node_t *node, int partition) { for (unsigned int i = 0; i < netloc_get_num_partitions(node); i++) { if (netloc_get_partition(node, i) == partition) return 1; } return NETLOC_SUCCESS; }