int set_node_ct( resource *pnodesp, /* I */ pbs_attribute *pattr, /* I */ int actmode) /* I */ { resource *pnct; resource_def *pndef; resource *ppct = NULL; resource_def *ppdef; resource *pprocsp; resource_def *pprocsdef; if (actmode == ATR_ACTION_RECOV) { /* SUCCESS */ return(0); } // WARNING: we are potentially re-sizing the vector in the calls to add_resource_entry() // below. All attempts to use pnodesp after the calls to add_resource_entry may be using an // invalid pointer, so copy data here std::string nodes_val(pnodesp->rs_value.at_val.at_str); /* Set "nodect" to count of nodes in "nodes" */ pndef = find_resc_def(svr_resc_def, "nodect", svr_resc_size); if (pndef == NULL) { return(PBSE_SYSTEM); } if ((pnct = find_resc_entry(pattr, pndef)) == NULL) { if ((pnct = add_resource_entry(pattr, pndef)) == NULL) { return(PBSE_SYSTEM); } } pnct->rs_value.at_val.at_long = ctnodes(nodes_val.c_str()); pnct->rs_value.at_flags |= ATR_VFLAG_SET; /* Set "neednodes" to "nodes", may be altered by scheduler */ pndef = find_resc_def(svr_resc_def, "neednodes", svr_resc_size); if (pndef == NULL) { return(PBSE_SYSTEM); } if ((pnct = find_resc_entry(pattr, pndef)) == NULL) { if ((pnct = add_resource_entry(pattr, pndef)) == NULL) { return(PBSE_SYSTEM); } } else { pndef->rs_free(&pnct->rs_value); } pndef->rs_decode(&pnct->rs_value, NULL, NULL, nodes_val.c_str(), ATR_DFLAG_ACCESS); pnct->rs_value.at_flags |= ATR_VFLAG_SET; /* SUCCESS nodect */ /* set "procct" to count of processors in "nodes" plus "procs" */ ppdef = find_resc_def(svr_resc_def, "procct", svr_resc_size); if (ppdef == NULL) { return(PBSE_SYSTEM); } if ((ppct = find_resc_entry(pattr, ppdef)) == NULL) { if ((ppct = add_resource_entry(pattr, ppdef)) == 0) { return(PBSE_SYSTEM); } } pprocsdef = find_resc_def(svr_resc_def, "procs", svr_resc_size); if (pprocsdef == NULL) { return(PBSE_SYSTEM); } if ((pprocsp = find_resc_entry(pattr, pprocsdef)) == NULL) { ppct->rs_value.at_val.at_long = count_proc(nodes_val.c_str()); } else { ppct->rs_value.at_val.at_long = pprocsp->rs_value.at_val.at_long; ppct->rs_value.at_val.at_long += count_proc(nodes_val.c_str()); } ppct->rs_value.at_flags |= ATR_VFLAG_SET; /* SUCCESS procct */ return(0); } /* END set_node_ct() */
int set_node_ct( resource *pnodesp, /* I */ pbs_attribute *pattr, /* I */ int actmode) /* I */ { resource *pnct; resource_def *pndef; resource *ppct = NULL; resource_def *ppdef; resource *pprocsp; resource_def *pprocsdef; if (actmode == ATR_ACTION_RECOV) { /* SUCCESS */ return(0); } /* Set "nodect" to count of nodes in "nodes" */ pndef = find_resc_def(svr_resc_def, "nodect", svr_resc_size); if (pndef == NULL) { return(PBSE_SYSTEM); } if ((pnct = find_resc_entry(pattr, pndef)) == NULL) { if ((pnct = add_resource_entry(pattr, pndef)) == NULL) { return(PBSE_SYSTEM); } } pnct->rs_value.at_val.at_long = ctnodes(pnodesp->rs_value.at_val.at_str); pnct->rs_value.at_flags |= ATR_VFLAG_SET; /* Set "neednodes" to "nodes", may be altered by scheduler */ pndef = find_resc_def(svr_resc_def, "neednodes", svr_resc_size); if (pndef == NULL) { return(PBSE_SYSTEM); } if ((pnct = find_resc_entry(pattr, pndef)) == NULL) { if ((pnct = add_resource_entry(pattr, pndef)) == NULL) { return(PBSE_SYSTEM); } } else { pndef->rs_free(&pnct->rs_value); } pndef->rs_decode(&pnct->rs_value, NULL, NULL, pnodesp->rs_value.at_val.at_str, ATR_DFLAG_ACCESS); pnct->rs_value.at_flags |= ATR_VFLAG_SET; /* SUCCESS nodect */ /* set "procct" to count of processors in "nodes" plus "procs" */ ppdef = find_resc_def(svr_resc_def, "procct", svr_resc_size); if (ppdef == NULL) { return(PBSE_SYSTEM); } if ((ppct = find_resc_entry(pattr, ppdef)) == NULL) { if ((ppct = add_resource_entry(pattr, ppdef)) == 0) { return(PBSE_SYSTEM); } } pprocsdef = find_resc_def(svr_resc_def, "procs", svr_resc_size); if (pprocsdef == NULL) { return(PBSE_SYSTEM); } if ((pprocsp = find_resc_entry(pattr, pprocsdef)) == NULL) { ppct->rs_value.at_val.at_long = count_proc(pnodesp->rs_value.at_val.at_str); } else { ppct->rs_value.at_val.at_long = pprocsp->rs_value.at_val.at_long; ppct->rs_value.at_val.at_long += count_proc(pnodesp->rs_value.at_val.at_str); } ppct->rs_value.at_flags |= ATR_VFLAG_SET; /* SUCCESS procct */ return(0); } /* END set_node_ct() */
int set_node_ct(resource *pnodesp, attribute *pattr, void *pobj, int type, int actmode) { #ifndef PBS_MOM int nn; /* num of nodes */ int nt; /* num of tasks (processes) */ int hcpp = 0; /* has :ccp in string */ long nc; resource *pnct; resource *pncpus; resource_def *pndef; if ((actmode == ATR_ACTION_RECOV) || ((pnodesp->rs_value.at_flags & ATR_VFLAG_SET) == 0)) return (0); /* first validate the spec */ if ((nn = validate_nodespec(pnodesp->rs_value.at_val.at_str)) != 0) return nn; /* Set "nodect" to count of nodes in "nodes" */ pndef = find_resc_def(svr_resc_def, "nodect", svr_resc_size); if (pndef == (resource_def *)0) return (PBSE_SYSTEM); if ((pnct = find_resc_entry(pattr, pndef)) == (resource *)0) { if ((pnct = add_resource_entry(pattr, pndef)) == 0) return (PBSE_SYSTEM); } nn = ctnodes(pnodesp->rs_value.at_val.at_str); pnct->rs_value.at_val.at_long = nn; pnct->rs_value.at_flags |= ATR_VFLAG_SET|ATR_VFLAG_MODCACHE; /* find the number of cpus specified in the node string */ nt = ctcpus(pnodesp->rs_value.at_val.at_str, &hcpp); /* Is "ncpus" set as a separate resource? */ pndef = find_resc_def(svr_resc_def, "ncpus", svr_resc_size); if (pndef == (resource_def *)0) return (PBSE_SYSTEM); if ((pncpus = find_resc_entry(pattr, pndef)) == (resource *)0) { if ((pncpus = add_resource_entry(pattr, pndef)) == 0) return (PBSE_SYSTEM); } if (((pncpus->rs_value.at_flags & (ATR_VFLAG_SET | ATR_VFLAG_DEFLT)) == ATR_VFLAG_SET) && (actmode == ATR_ACTION_NEW)) { /* ncpus is already set and not a default and new job */ nc = pncpus->rs_value.at_val.at_long; if (hcpp && (nt != pncpus->rs_value.at_val.at_long)) { /* if cpp string specificed, this is an error */ return (PBSE_BADATVAL); } else if ((nc % nt) != 0) { /* ncpus must be multiple of number of tasks */ return (PBSE_BADATVAL); } } else { /* ncpus is not set or not a new job (qalter being done) */ /* force ncpus to the correct thing */ pncpus->rs_value.at_val.at_long = nt; pncpus->rs_value.at_flags |= (ATR_VFLAG_SET|ATR_VFLAG_MODCACHE); } #endif /* not MOM */ return (0); }