On 08:46 Mon 20 Jul , Hal Rosenstock wrote: > Any comment about what this patch is supposed to do?
> 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; This breaks reenterability. Sasha > + > +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
