drmaa2_j drmaa2_jsession_wait_any_terminated (const drmaa2_jsession js, const drmaa2_j_list l, const time_t timeout) { drmaa2_j terminated_j = NULL; drmaa2_j current_j = NULL; drmaa2_jstate state; size_t i; while (terminated_j == NULL) { for (i = 0; i < drmaa2_list_size(l); i++) { current_j = (drmaa2_j)drmaa2_list_get(l, i); state = get_state(current_j); if (state == DRMAA2_DONE || state == DRMAA2_FAILED) { terminated_j = (drmaa2_j)malloc(sizeof(drmaa2_j_s)); terminated_j->session_name = strdup(js->name); terminated_j->id = strdup(current_j->id); break; } } if (terminated_j != NULL) { break; } else if (timeout == DRMAA2_ZERO_TIME || (timeout != DRMAA2_INFINITE_TIME && timeout <= time(NULL))) { drmaa2_lasterror_v = DRMAA2_TIMEOUT; drmaa2_lasterror_text_v = "A timeout occured while waiting for job termination."; break; } sleep(1); } return terminated_j; }
// helper method to avoid code duplication drmaa2_error drmaa2_jarray_change_state(drmaa2_jarray ja, drmaa2_error (*chage_state_method)(drmaa2_j)) { drmaa2_j_list jl = drmaa2_jarray_get_jobs(ja); size_t i; for (i = 0; i < drmaa2_list_size(jl); i++) { chage_state_method((drmaa2_j)drmaa2_list_get(jl, i)); } drmaa2_list_free(&jl); return DRMAA2_SUCCESS; }
int main(int argc, char *argv[]) { char cwd[100]; drmaa2_string jid1, jid2; printf("==== Create a job session with given session name.\n"); drmaa2_jsession js = drmaa2_create_jsession("mysession", NULL); printf("==== Creating the job template.\n"); drmaa2_jtemplate jt = drmaa2_jtemplate_create(); jt->jobName = strdup("ht2"); jt->remoteCommand = strdup("/bin/ls"); if ( getcwd(cwd, DRMAA2_ATTR_BUFFER) == NULL ) { perror("Error getting current working directory"); exit(-1); } jt->workingDirectory = strdup(cwd); jt->args=drmaa2_list_create(DRMAA2_STRINGLIST,DRMAA2_UNSET_CALLBACK); drmaa2_list_add(jt->args,"-l"); drmaa2_list_add(jt->args,"-a"); drmaa2_list_add(jt->args,"/tmp"); jt->outputPath=strdup("stdout."DRMAA2_GW_JOB_ID); jt->errorPath =strdup("stderr."DRMAA2_GW_JOB_ID); drmaa2_j j1=NULL; drmaa2_j j2=NULL; printf("==== Submiting 2 jobs.\n"); j1 = drmaa2_jsession_run_job(js, jt); j2 = drmaa2_jsession_run_job(js, jt); jid1 = drmaa2_j_get_id(j1); jid2 = drmaa2_j_get_id(j2); printf("==== Your jobs have been submitted with id: %s and %s\n", jid1, jid2); drmaa2_j_list jobs = drmaa2_jsession_get_jobs(js, NULL); printf("==== There are %ld jobs in the job list\n", drmaa2_list_size(jobs)); drmaa2_j_wait_terminated(j1, DRMAA2_INFINITE_TIME); drmaa2_j_wait_terminated(j2, DRMAA2_INFINITE_TIME); printf("==== Destroying job template and job session.\n"); drmaa2_list_free(&jobs); drmaa2_jtemplate_free(&jt); drmaa2_destroy_jsession("mysession"); drmaa2_jsession_free(&js); printf("==== Exiting now.\n"); return 0; }
drmaa2_j drmaa2_jsession_run_job(const drmaa2_jsession js, const drmaa2_jtemplate jt) { if (!jsession_is_valid(js)) { drmaa2_lasterror_v = DRMAA2_INVALID_SESSION; drmaa2_lasterror_text_v = "Job session is invalid."; return NULL; } if (jt->jobCategory != DRMAA2_UNSET_STRING) { drmaa2_string_list sl = drmaa2_jsession_get_job_categories(js); drmaa2_bool supported = DRMAA2_FALSE; size_t i; for (i = 0; i < drmaa2_list_size(sl); i++) { if (strcmp(jt->jobCategory, drmaa2_list_get(sl, i)) == 0) { supported = DRMAA2_TRUE; break; } } if (supported == DRMAA2_FALSE) { drmaa2_lasterror_v = DRMAA2_INVALID_ARGUMENT; drmaa2_lasterror_text_v = "Given job category is not supported."; return NULL; } } if (!drmaa2_supports(DRMAA2_JT_EMAIL) && (jt->email != DRMAA2_UNSET_LIST || jt->emailOnStarted != DRMAA2_UNSET_BOOL || jt->emailOnTerminated != DRMAA2_UNSET_BOOL)) { drmaa2_lasterror_v = DRMAA2_UNSUPPORTED_ATTRIBUTE; drmaa2_lasterror_text_v = "Email is not supported."; return NULL; } if (!drmaa2_supports(DRMAA2_JT_MAXSLOTS) && jt->maxSlots != DRMAA2_UNSET_NUM) { drmaa2_lasterror_v = DRMAA2_UNSUPPORTED_ATTRIBUTE; drmaa2_lasterror_text_v = "MaxSlot is not supported."; return NULL; } if (!drmaa2_supports(DRMAA2_JT_DEADLINE) && jt->deadlineTime != DRMAA2_UNSET_TIME) { drmaa2_lasterror_v = DRMAA2_UNSUPPORTED_ATTRIBUTE; drmaa2_lasterror_text_v = "DeadLineTime is not supported."; return NULL; } if (!drmaa2_supports(DRMAA2_JT_STAGING) && (jt->stageInFiles != DRMAA2_UNSET_DICT || jt->stageOutFiles != DRMAA2_UNSET_DICT)) { drmaa2_lasterror_v = DRMAA2_UNSUPPORTED_ATTRIBUTE; drmaa2_lasterror_text_v = "Staging is not supported."; return NULL; } if (!drmaa2_supports(DRMAA2_JT_ACCOUNTINGID) && jt->accountingId != DRMAA2_UNSET_STRING) { drmaa2_lasterror_v = DRMAA2_UNSUPPORTED_ATTRIBUTE; drmaa2_lasterror_text_v = "AccountingID is not supported."; return NULL; } // further evaluation can be done here long long template_id = save_jtemplate(jt, js->name); long long job_id = save_job(js, template_id); return submit_job_to_DRMS(js, job_id, jt); }