Signed-off-by: Robert Pearson <[email protected]> Signed-off-by: Hal Rosenstock <[email protected]> --- diff --git a/opensm/opensm/osm_mesh.c b/opensm/opensm/osm_mesh.c index 23fad87..a463ca9 100644 --- a/opensm/opensm/osm_mesh.c +++ b/opensm/opensm/osm_mesh.c @@ -1272,6 +1272,80 @@ static int reorder_links(lash_t *p_lash, mesh_t *mesh) } /* + * compare two switches in a sort + */ + +/* Sort switches never gets called more than once so we can use a + static structure to keep our context. */ +static struct { + lash_t *p_lash; + mesh_t *mesh; +} sort_ctx; + +static int compare_switch(const void *p1, const void *p2) +{ + int i, j, d; + int dimension = sort_ctx.mesh->dimension; + switch_t *s1 = sort_ctx.p_lash->switches[*(int *)p1]; + switch_t *s2 = sort_ctx.p_lash->switches[*(int *)p2]; + + for (i = 0; i < dimension; i++) { + j = sort_ctx.mesh->dim_order[i]; + d = s1->node->coord[j] - s2->node->coord[j]; + + if (d > 0) + return 1; + + if (d < 0) + return -1; + } + + return 0; +} + +/* + * sort_switches - reorder switch array in p_lash + */ +static void sort_switches(lash_t *p_lash, mesh_t *mesh) +{ + int i, j; + int num_switches = p_lash->num_switches; + int *index, *reverse; + switch_t *s; + switch_t **switches; + + index = calloc(num_switches, sizeof(int)); + reverse = calloc(num_switches, sizeof(int)); + switches = calloc(num_switches, sizeof(switch_t *)); + + for (i = 0; i < num_switches; i++) + index[i] = i; + + sort_ctx.mesh = mesh; + sort_ctx.p_lash = p_lash; + qsort(index, num_switches, sizeof(int), compare_switch); + + for (i = 0; i < num_switches; i++) + reverse[index[i]] = i; + + for (i = 0; i < num_switches; i++) { + s = p_lash->switches[index[i]]; + switches[i] = s; + s->id = i; + for (j = 0; j < s->node->num_links; j++) + s->node->links[j]->switch_id = + reverse[s->node->links[j]->switch_id]; + } + + for (i = 0; i < num_switches; i++) + p_lash->switches[i] = switches[i]; + + free(switches); + free(index); + free(reverse); +} + +/* * osm_mesh_delete - free per mesh resources */ static void mesh_delete(mesh_t *mesh) @@ -1470,6 +1544,8 @@ int osm_do_mesh_analysis(lash_t *p_lash) if (reorder_links(p_lash, mesh)) goto err; + sort_switches(p_lash, mesh); + p = buf; p += sprintf(p, "found "); for (i = 0; i < mesh->dimension; i++) _______________________________________________ general mailing list [email protected] http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general
To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general
