Temporary fix -- will be obviated by the size_t (et al.) fixes coming
soon. Make ORTE_EXIT_CODE be the same as INT32, not INT8. This allows the full propogation of the value returned by waitpid() rather than just the lowest 8 bites. Also change the naming of it in orterun to be exit_status, not exit_code (per POSIX standard naming convention). orterun now returns the first nonzero exit status that it receives. This commit was SVN r5530.
Этот коммит содержится в:
родитель
ca35c1276c
Коммит
c13c802944
@ -62,7 +62,6 @@ size_t orte_dps_memory_required(void *src, size_t num_vals, orte_data_type_t typ
|
||||
case ORTE_DATA_TYPE:
|
||||
case ORTE_NODE_STATE:
|
||||
case ORTE_PROC_STATE:
|
||||
case ORTE_EXIT_CODE:
|
||||
case ORTE_BOOL:
|
||||
case ORTE_BYTE:
|
||||
case ORTE_INT8:
|
||||
@ -80,6 +79,7 @@ size_t orte_dps_memory_required(void *src, size_t num_vals, orte_data_type_t typ
|
||||
case ORTE_JOBID:
|
||||
case ORTE_CELLID:
|
||||
case ORTE_GPR_NOTIFY_ID:
|
||||
case ORTE_EXIT_CODE:
|
||||
case ORTE_INT32:
|
||||
case ORTE_UINT32:
|
||||
return (size_t)(num_vals * sizeof(uint32_t));
|
||||
|
@ -173,7 +173,6 @@ int orte_dps_pack_nobuffer(void *dst, void *src, size_t num_vals,
|
||||
case ORTE_DATA_TYPE:
|
||||
case ORTE_NODE_STATE:
|
||||
case ORTE_PROC_STATE:
|
||||
case ORTE_EXIT_CODE:
|
||||
case ORTE_BYTE:
|
||||
case ORTE_INT8:
|
||||
case ORTE_UINT8:
|
||||
@ -204,6 +203,7 @@ int orte_dps_pack_nobuffer(void *dst, void *src, size_t num_vals,
|
||||
case ORTE_JOBID:
|
||||
case ORTE_CELLID:
|
||||
case ORTE_GPR_NOTIFY_ID:
|
||||
case ORTE_EXIT_CODE:
|
||||
case ORTE_INT32:
|
||||
case ORTE_UINT32:
|
||||
dptr = (char *) dst;
|
||||
|
@ -168,7 +168,6 @@ int orte_dps_unpack_nobuffer(void *dst, void *src, size_t num_vals,
|
||||
case ORTE_DATA_TYPE:
|
||||
case ORTE_NODE_STATE:
|
||||
case ORTE_PROC_STATE:
|
||||
case ORTE_EXIT_CODE:
|
||||
case ORTE_BYTE:
|
||||
case ORTE_INT8:
|
||||
case ORTE_UINT8:
|
||||
@ -209,6 +208,7 @@ int orte_dps_unpack_nobuffer(void *dst, void *src, size_t num_vals,
|
||||
case ORTE_JOBID:
|
||||
case ORTE_CELLID:
|
||||
case ORTE_GPR_NOTIFY_ID:
|
||||
case ORTE_EXIT_CODE:
|
||||
case ORTE_INT32:
|
||||
case ORTE_UINT32:
|
||||
|
||||
|
@ -86,7 +86,7 @@ struct globals_t {
|
||||
bool no_wait_for_job_completion;
|
||||
bool debug;
|
||||
int num_procs;
|
||||
int exit_code;
|
||||
int exit_status;
|
||||
char *hostfile;
|
||||
char *env_val;
|
||||
char *appfile;
|
||||
@ -99,7 +99,7 @@ static bool globals_init = false;
|
||||
|
||||
struct proc_info_t {
|
||||
bool reported;
|
||||
int32_t exit_code;
|
||||
int32_t exit_status;
|
||||
};
|
||||
struct proc_info_t *proc_infos = NULL;
|
||||
|
||||
@ -239,7 +239,7 @@ int main(int argc, char *argv[], char* env[])
|
||||
}
|
||||
for (i = 0; i < j; ++i) {
|
||||
proc_infos[i].reported = false;
|
||||
proc_infos[i].exit_code = 0;
|
||||
proc_infos[i].exit_status = 0;
|
||||
}
|
||||
|
||||
/* Intialize our Open RTE environment */
|
||||
@ -275,8 +275,13 @@ int main(int argc, char *argv[], char* env[])
|
||||
&orterun_globals.lock);
|
||||
}
|
||||
/* Make sure we propagate the exit code */
|
||||
rc = orterun_globals.exit_code;
|
||||
if (WIFEXITED(orterun_globals.exit_status)) {
|
||||
rc = WEXITSTATUS(orterun_globals.exit_status);
|
||||
} else {
|
||||
rc = WTERMSIG(orterun_globals.exit_status);
|
||||
}
|
||||
OMPI_THREAD_UNLOCK(&orterun_globals.lock);
|
||||
orte_gpr.dump_segments(0);
|
||||
|
||||
/* If we showed more abort messages than were allowed,
|
||||
show a followup message here */
|
||||
@ -315,8 +320,8 @@ static void dump_aborted_procs(orte_jobid_t jobid)
|
||||
orte_gpr_value_t** values = NULL;
|
||||
int i, k, num_values = 0;
|
||||
int rc;
|
||||
int32_t exit_code = 0;
|
||||
bool exit_code_set;
|
||||
int32_t exit_status = 0;
|
||||
bool exit_status_set;
|
||||
char *keys[] = {
|
||||
ORTE_PROC_NAME_KEY,
|
||||
ORTE_PROC_PID_KEY,
|
||||
@ -353,8 +358,8 @@ static void dump_aborted_procs(orte_jobid_t jobid)
|
||||
uint32_t rank = -1;
|
||||
char* node_name = NULL;
|
||||
|
||||
exit_code = 0;
|
||||
exit_code_set = false;
|
||||
exit_status = 0;
|
||||
exit_status_set = false;
|
||||
for(k=0; k < value->cnt; k++) {
|
||||
orte_gpr_keyval_t* keyval = value->keyvals[k];
|
||||
if(strcmp(keyval->key, ORTE_PROC_NAME_KEY) == 0) {
|
||||
@ -370,8 +375,8 @@ static void dump_aborted_procs(orte_jobid_t jobid)
|
||||
continue;
|
||||
}
|
||||
if(strcmp(keyval->key, ORTE_PROC_EXIT_CODE_KEY) == 0) {
|
||||
exit_code = keyval->value.i32;
|
||||
exit_code_set = true;
|
||||
exit_status = keyval->value.exit_code;
|
||||
exit_status_set = true;
|
||||
continue;
|
||||
}
|
||||
if(strcmp(keyval->key, ORTE_NODE_NAME_KEY) == 0) {
|
||||
@ -379,33 +384,33 @@ static void dump_aborted_procs(orte_jobid_t jobid)
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (rank >= 0 && exit_code_set) {
|
||||
proc_infos[rank].exit_code = exit_code;
|
||||
if (rank >= 0 && exit_status_set) {
|
||||
proc_infos[rank].exit_status = exit_status;
|
||||
}
|
||||
|
||||
if (WIFSIGNALED(exit_code) && rank >= 0 &&
|
||||
if (WIFSIGNALED(exit_status) && rank >= 0 &&
|
||||
!proc_infos[rank].reported) {
|
||||
proc_infos[rank].reported = true;
|
||||
|
||||
if (9 == WTERMSIG(exit_code)) {
|
||||
if (9 == WTERMSIG(exit_status)) {
|
||||
++num_killed;
|
||||
} else {
|
||||
if (num_aborted < max_display_aborted) {
|
||||
fprintf(stderr, "Job rank %d (pid %d) on node \"%s\" exited on signal %d\n",
|
||||
rank, pid, node_name, WTERMSIG(exit_code));
|
||||
rank, pid, node_name, WTERMSIG(exit_status));
|
||||
}
|
||||
++num_aborted;
|
||||
}
|
||||
}
|
||||
|
||||
/* If we haven't done so already, hold the exit_code so we can
|
||||
/* If we haven't done so already, hold the exit_status so we can
|
||||
return it when exiting. Specifically, keep the first
|
||||
non-zero entry. If they all return zero, we'll return
|
||||
zero. */
|
||||
|
||||
OMPI_THREAD_LOCK(&orterun_globals.lock);
|
||||
if (0 == orterun_globals.exit_code && exit_code_set) {
|
||||
orterun_globals.exit_code = exit_code;
|
||||
if (0 == orterun_globals.exit_status && exit_status_set) {
|
||||
orterun_globals.exit_status = exit_status;
|
||||
}
|
||||
OMPI_THREAD_UNLOCK(&orterun_globals.lock);
|
||||
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user