int process_gpu_status( struct pbsnode *pnode, char **str_ptr) { char *str = *str_ptr; pbs_attribute temp; int gpu_count = 0; int rc; char buf[MAXLINE * 2]; dynamic_string *gpu_info; memset(&temp, 0, sizeof(temp)); if ((gpu_info = get_dynamic_string(-1, NULL)) == NULL) { *str_ptr = finish_gpu_status(str); return(ENOMEM); } if ((rc = decode_arst(&temp, NULL, NULL, NULL, 0)) != PBSE_NONE) { log_record(PBSEVENT_DEBUG, PBS_EVENTCLASS_NODE, __func__, "cannot initialize attribute"); *str_ptr = finish_gpu_status(str); free_dynamic_string(gpu_info); return(rc); } /* move past the initial gpu status */ str += strlen(str) + 1; for (; str != NULL && *str != '\0'; str += strlen(str) + 1) { if (!strcmp(str, CRAY_GPU_STATUS_END)) break; if (!strncmp(str, "gpu_id=", strlen("gpu_id="))) { snprintf(buf, sizeof(buf), "gpu[%d]=%s;", gpu_count, str); rc = append_dynamic_string(gpu_info, buf); gpu_count++; } else { rc = append_dynamic_string(gpu_info, str); rc = append_char_to_dynamic_string(gpu_info, ';'); } if (rc != PBSE_NONE) { free_dynamic_string(gpu_info); *str_ptr = finish_gpu_status(str); return(rc); } } set_ngpus(pnode, gpu_count); decode_arst(&temp, NULL, NULL, gpu_info->str, 0); node_gpustatus_list(&temp, pnode, ATR_ACTION_ALTER); free_arst(&temp); free_dynamic_string(gpu_info); *str_ptr = str; return(PBSE_NONE); } /* END process_gpu_status() */
int process_mic_status( struct pbsnode *pnode, char **str_ptr) { char *str = *str_ptr; int rc = PBSE_NONE; pbs_attribute temp; int mic_count = 0; dynamic_string *single_mic_status = get_dynamic_string(-1, NULL); char mic_id_buf[MAXLINE]; memset(&temp, 0, sizeof(temp)); if ((rc = decode_arst(&temp, NULL, NULL, NULL, 0)) != PBSE_NONE) { log_record(PBSEVENT_DEBUG, PBS_EVENTCLASS_NODE, __func__, "cannot initialize attribute"); *str_ptr = move_past_mic_status(str); return(rc); } for (str = str + strlen(str) + 1; str != NULL && str[0] != '\0'; str += strlen(str) + 1) { if (!strcmp(str, END_MIC_STATUS)) break; if (!strncmp(str, "mic_id=", strlen("mic_id="))) { if ((rc = save_single_mic_status(single_mic_status, &temp)) != PBSE_NONE) break; snprintf(mic_id_buf, sizeof(mic_id_buf), "mic[%d]=%s", mic_count, str); append_dynamic_string(single_mic_status, mic_id_buf); mic_count++; } else { append_char_to_dynamic_string(single_mic_status, ';'); append_dynamic_string(single_mic_status, str); } } rc = save_single_mic_status(single_mic_status, &temp); if (mic_count > pnode->nd_nmics) { pnode->nd_nmics_free += mic_count - pnode->nd_nmics; pnode->nd_nmics = mic_count; if (mic_count > pnode->nd_nmics_alloced) { struct jobinfo *tmp = (struct jobinfo *)calloc(mic_count, sizeof(struct jobinfo)); if (tmp == NULL) return(ENOMEM); memcpy(tmp, pnode->nd_micjobs, sizeof(struct jobinfo) * pnode->nd_nmics_alloced); free(pnode->nd_micjobs); pnode->nd_micjobs = tmp; pnode->nd_nmics_alloced = mic_count; } } *str_ptr = move_past_mic_status(str); node_micstatus_list(&temp, pnode, ATR_ACTION_ALTER); return(rc); } /* END process_mic_status() */