int drmaa_get_attribute( drmaa_job_template_t *jt, const char *name, char *value, size_t value_len, char *errmsg, size_t errlen ) { const drmaa_attrib_info_t *attr; int attr_no; attr = attr_by_drmaa_name(name); if (attr == NULL || drmaa_is_vector(attr)) RAISE_DRMAA(DRMAA_ERRNO_INVALID_ARGUMENT); attr_no = attr->code; pthread_mutex_lock(&jt->mutex); if (jt->attrib[attr_no] != NULL) strlcpy(value, jt->attrib[attr_no], value_len); else strlcpy(value, "", value_len); pthread_mutex_unlock(&jt->mutex); return DRMAA_ERRNO_SUCCESS; }
int drmaa_get_vector_attribute( drmaa_job_template_t *jt, const char *name, drmaa_attr_values_t **out_values, char *errmsg, size_t errlen ) { const drmaa_attrib_info_t *attr; unsigned i, n_values; char **v, **value; attr = attr_by_drmaa_name(name); if (attr == NULL || !drmaa_is_vector(attr)) RAISE_DRMAA(DRMAA_ERRNO_INVALID_ARGUMENT); pthread_mutex_lock(&jt->mutex); value = (char**)jt->attrib[ attr->code ]; pthread_mutex_unlock(&jt->mutex); if (value == NULL) { *out_values = NULL; return DRMAA_ERRNO_SUCCESS; } for (n_values = 0; value[n_values] != NULL; n_values++) {} v = (char**)calloc(n_values + 1, sizeof(char*)); if (v == NULL) RAISE_NO_MEMORY(); for (i = 0; i < n_values; i++) { v[i] = strdup(value[i]); if (v[i] == NULL) { drmaa_free_vector(v); RAISE_NO_MEMORY(); } } v[n_values] = NULL; *out_values = malloc(sizeof(drmaa_attr_values_t)); (*out_values)->list = (*out_values)->iter = v; return DRMAA_ERRNO_SUCCESS; }
int drmaa_set_vector_attribute( drmaa_job_template_t *jt, const char *name, const char *value[], char *errmsg, size_t errlen ) { const drmaa_attrib_info_t *attr; char **v; int attr_no; unsigned i, n_values; attr = attr_by_drmaa_name(name); if (attr == NULL || !drmaa_is_vector(attr)) RAISE_DRMAA(DRMAA_ERRNO_INVALID_ARGUMENT); attr_no = attr->code; for (n_values = 0; value[n_values] != NULL; n_values++) {} v = (char**)calloc(n_values + 1, sizeof(char*)); if (v == NULL) RAISE_NO_MEMORY(); for (i = 0; i < n_values; i++) { v[i] = strdup(value[i]); if (v[i] == NULL) { drmaa_free_vector(v); RAISE_NO_MEMORY(); } } v[n_values] = NULL; pthread_mutex_lock(&jt->mutex); if (jt->attrib[attr_no] != NULL) drmaa_free_vector((char**)jt->attrib[attr_no]); jt->attrib[attr_no] = v; pthread_mutex_unlock(&jt->mutex); return DRMAA_ERRNO_SUCCESS; }
int drmaa_exit(char *errmsg, size_t errlen) { int rc = DRMAA_ERRNO_SUCCESS; DEBUG(("-> drmaa_exit")); pthread_mutex_lock(&drmaa_session_mutex); if (drmaa_session == NULL) { pthread_mutex_unlock(&drmaa_session_mutex); RAISE_DRMAA(DRMAA_ERRNO_NO_ACTIVE_SESSION); } rc = drmaa_destroy(drmaa_session, errmsg, errlen); drmaa_session = NULL; pthread_mutex_unlock(&drmaa_session_mutex); DEBUG(("<- drmaa_exit =%d", rc)); return rc; }
int drmaa_set_job_submit_state( drmaa_submission_context_t *c, char *errmsg, size_t errlen ) { const char *submit_state = (const char *)c->jt->attrib[ATTR_JOB_SUBMIT_STATE]; const char *hold_types; int rc = DRMAA_ERRNO_SUCCESS; if (submit_state == NULL || !strcmp(submit_state, DRMAA_SUBMISSION_STATE_ACTIVE)) hold_types = "n"; else if (!strcmp(submit_state, DRMAA_SUBMISSION_STATE_HOLD)) hold_types = "u"; else RAISE_DRMAA(DRMAA_ERRNO_INVALID_ATTRIBUTE_VALUE); rc = drmaa_add_pbs_attr(c, ATTR_HOLD_TYPES, strdup(hold_types), 0, errmsg, errlen); return rc; }
int drmaa_set_file_staging( drmaa_submission_context_t *c, char *errmsg, size_t errlen ) { void **attrib = c->jt->attrib; char *transfer_files = (char*)attrib[ ATTR_TRANSFER_FILES ]; char *input_file = NULL; char *output_file = NULL; char *error_file = NULL; char *output_staging = NULL; char *error_staging = NULL; char *stageout = NULL; int rc = DRMAA_ERRNO_SUCCESS; if (transfer_files) { char *i; for (i = transfer_files; *i; i++) switch (*i) { case 'i': input_file = (char*)attrib[ ATTR_INPUT_PATH ]; break; case 'o': output_file = (char*)attrib[ ATTR_OUTPUT_PATH ]; break; case 'e': error_file = (char*)attrib[ ATTR_ERROR_PATH ]; break; default: RAISE_DRMAA(DRMAA_ERRNO_INVALID_ATTRIBUTE_VALUE); } } else return DRMAA_ERRNO_SUCCESS; if (input_file) { rc = drmaa_add_pbs_attr(c, ATTR_STAGEIN, drmaa_translate_staging(input_file), DRMAA_PLACEHOLDER_MASK_HD | DRMAA_PLACEHOLDER_MASK_WD | DRMAA_PLACEHOLDER_MASK_INCR, errmsg, errlen); if (rc) return rc; } if (output_file) output_staging = drmaa_translate_staging(output_file); if (error_file) error_staging = drmaa_translate_staging(error_file); if (output_staging && error_staging) asprintf(&stageout, "%s,%s", output_staging, error_staging); else if (output_staging) stageout = output_staging; else if (error_staging) stageout = error_staging; rc = drmaa_add_pbs_attr(c, ATTR_STAGEOUT, stageout, DRMAA_PLACEHOLDER_MASK_HD | DRMAA_PLACEHOLDER_MASK_WD | DRMAA_PLACEHOLDER_MASK_INCR, errmsg, errlen); if (output_staging && output_staging != stageout) free(output_staging); if (error_staging && error_staging != stageout) free(error_staging); return rc; }
/** Writes job's PBS script to temporary file. */ int drmaa_create_job_script( drmaa_submission_context_t *c, char *errmsg, size_t errlen ) { size_t script_size; const char *job, *wd, **argv; char *input_path; char *script, *s; const char **i; int rc; void **attrib = c->jt->attrib; job = (const char*) attrib[ ATTR_JOB_PATH ]; wd = (const char*) attrib[ ATTR_JOB_WORKING_DIR ]; argv = (const char**)attrib[ ATTR_ARGV ]; input_path = (char *) attrib[ ATTR_INPUT_PATH ]; if (job == NULL) RAISE_DRMAA(DRMAA_ERRNO_INVALID_ATTRIBUTE_VALUE); /* compute script length */ script_size = 0; if (wd != NULL) script_size += strlen("cd ") + strlen(wd) + strlen("; "); script_size += strlen("exec ") + strlen(job); if (argv != NULL) for (i = argv; *i != NULL; i++) script_size += 1 + strlen(*i); if (input_path != NULL) script_size += sizeof(" <") + strlen(input_path); script = (char*)malloc(script_size + 1); if (script == NULL) RAISE_NO_MEMORY(); s = script; if (wd != NULL) s += sprintf(s, "cd %s; ", wd); s += sprintf(s, "exec %s", job); if (argv != NULL) for (i = argv; *i != NULL; i++) s += sprintf(s, " %s", *i); if (input_path != NULL) { char *colon = strchr(input_path, ':'); if (colon != NULL) input_path = colon + 1; s += sprintf(s, " <%s", input_path); } DEBUG(("script before substitution = {%s}", script)); script = drmaa_expand_placeholders(c, script, DRMAA_PLACEHOLDER_MASK_HD | DRMAA_PLACEHOLDER_MASK_WD | DRMAA_PLACEHOLDER_MASK_INCR); DEBUG(("script after substitution = {%s}", script)); rc = drmaa_write_tmpfile(&c->script_filename, script, strlen(script), errmsg, errlen); free(script); return rc; }