20a91c2baf
Cleanup debug message
92 строки
2.2 KiB
C
92 строки
2.2 KiB
C
/* -*- C -*-
|
|
*
|
|
* $HEADER$
|
|
*
|
|
* A program that just spins - provides mechanism for testing user-driven
|
|
* abnormal program termination
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include "mpi.h"
|
|
|
|
#include "opal/dss/dss.h"
|
|
#include "opal/mca/pmix/pmix.h"
|
|
#include "opal/util/output.h"
|
|
#include "orte/util/name_fns.h"
|
|
#include "orte/constants.h"
|
|
|
|
static volatile bool register_active = false;
|
|
|
|
static void _event_fn(int status,
|
|
const opal_process_name_t *source,
|
|
opal_list_t *info, opal_list_t *results,
|
|
opal_pmix_notification_complete_fn_t cbfunc,
|
|
void *cbdata)
|
|
{
|
|
opal_value_t *kv;
|
|
orte_process_name_t proc;
|
|
|
|
/* the name of the terminating proc should be on the info list */
|
|
proc.jobid = ORTE_JOBID_INVALID;
|
|
proc.vpid = ORTE_VPID_INVALID;
|
|
OPAL_LIST_FOREACH(kv, info, opal_value_t) {
|
|
if (0 == strcmp(kv->key, OPAL_PMIX_EVENT_AFFECTED_PROC)) {
|
|
proc.jobid = kv->data.name.jobid;
|
|
proc.vpid = kv->data.name.vpid;
|
|
break;
|
|
}
|
|
}
|
|
|
|
opal_output(0, "NOTIFIED OF TERMINATION OF PROC %s",
|
|
ORTE_NAME_PRINT(&proc));
|
|
|
|
/* must let the notifier know we are done */
|
|
if (NULL != cbfunc) {
|
|
cbfunc(ORTE_SUCCESS, NULL, NULL, NULL, cbdata);
|
|
}
|
|
}
|
|
|
|
static void _register_fn(int status,
|
|
size_t evhandler_ref,
|
|
void *cbdata)
|
|
{
|
|
opal_list_t *codes = (opal_list_t*)cbdata;
|
|
|
|
OPAL_LIST_RELEASE(codes);
|
|
register_active = false;
|
|
}
|
|
|
|
|
|
int main(int argc, char* argv[])
|
|
{
|
|
|
|
int i;
|
|
double pi;
|
|
opal_list_t *codes;
|
|
opal_value_t *kv;
|
|
|
|
MPI_Init(&argc, &argv);
|
|
|
|
/* register an event handler for the OPAL_ERR_PROC_ABORTED event */
|
|
codes = OBJ_NEW(opal_list_t);
|
|
kv = OBJ_NEW(opal_value_t);
|
|
kv->key = strdup("errorcode");
|
|
kv->type = OPAL_INT;
|
|
kv->data.integer = OPAL_ERR_PROC_ABORTED;
|
|
opal_list_append(codes, &kv->super);
|
|
|
|
register_active = true;
|
|
opal_pmix.register_evhandler(codes, NULL, _event_fn, _register_fn, codes);
|
|
|
|
i = 0;
|
|
while (1) {
|
|
i++;
|
|
pi = i / 3.14159256;
|
|
if (i > 100) i = 0;
|
|
}
|
|
|
|
MPI_Finalize();
|
|
|
|
return 0;
|
|
}
|