/* * Select some resources from the found tree * frt is found resource tree * prt is selected resource tree parent */ static resrc_tree_t *test_select_resources (resrc_tree_t *frt, resrc_tree_t *prt, int select) { resrc_tree_t *selected_res = NULL; if (frt) { resrc_t *resrc = resrc_tree_resrc (frt); if (!strcmp (resrc_type(resrc), "core")) { if (resrc_id (resrc) == select) resrc_stage_resrc (resrc, 1, NULL); else goto ret; } else if (!strcmp (resrc_type(resrc), "memory")) resrc_stage_resrc (resrc, 100, NULL); selected_res = resrc_tree_new (prt, resrc); if (resrc_tree_num_children (frt)) { resrc_tree_t *child = resrc_tree_list_first ( resrc_tree_children (frt)); while (child) { (void) test_select_resources (child, selected_res, select); child = resrc_tree_list_next (resrc_tree_children (frt)); } } } ret: return selected_res; }
static int rsreader_set_granular_digest (resrc_api_ctx_t *rsapi, machs_t *machs, resrc_tree_t *rt, char **err_str) { char *e_str = NULL; const char *digest = NULL; int nsocks = 0, ncs = 0; int rc = -1; resrc_t *r = NULL; if (rt) { r = resrc_tree_resrc (rt); if (strcmp (resrc_type (r), "node")) { if (resrc_tree_num_children (rt)) { resrc_tree_list_t *children = resrc_tree_children (rt); if (children) { resrc_tree_t *child = resrc_tree_list_first (children); while (child) { rc = rsreader_set_granular_digest (rsapi, machs, child, err_str); if (rc) break; child = resrc_tree_list_next (children); } } } } else if (!find_all_sockets_cores (rsapi, r, &nsocks, &ncs)) { /* matches based on the hostname, number of sockets and * cores. This linking isn't used by hwloc reader so * count-based matching is okay */ digest = rs2rank_tab_eq_by_count(machs, resrc_name (r), nsocks, ncs); if (digest) { (void) resrc_set_digest (r, xasprintf ("%s", digest)); rc = 0; } else e_str = xasprintf ("%s: Can't find a matching resrc for " "<%s,%d,%d>", __FUNCTION__, resrc_name (r), nsocks, ncs); } } if (err_str) *err_str = e_str; else free (e_str); return rc; }
static int rsreader_set_node_digest (machs_t *machs, resrc_tree_t *rt) { const char *digest = NULL; int rc = -1; resrc_t *r = NULL; if (rt) { r = resrc_tree_resrc (rt); if (strcmp (resrc_type (r), "node")) { if (resrc_tree_num_children (rt)) { resrc_tree_list_t *children = resrc_tree_children (rt); if (children) { resrc_tree_t *child = resrc_tree_list_first (children); while (child) { rc = rsreader_set_node_digest (machs, child); if (rc) break; child = resrc_tree_list_next (children); } } } } else { /* Use the digest from the first resource partition of * the first node in the machine table */ digest = rs2rank_tab_eq_by_none (machs); if (digest) { (void) resrc_set_digest (r, xasprintf ("%s", digest)); rc = 0; } } } return rc; }