#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include "examples.h"
#include <pmix_tool.h>
static pmix_proc_t myproc;
static void notification_fn(size_t evhdlr_registration_id, pmix_status_t status,
const pmix_proc_t *source, pmix_info_t info[], size_t ninfo,
pmix_info_t results[], size_t nresults,
pmix_event_notification_cbfunc_fn_t cbfunc, void *cbdata)
{
myrel_t *lock = NULL;
size_t n;
pmix_status_t jobstatus = 0;
pmix_proc_t affected;
char *msg = NULL;
EXAMPLES_HIDE_UNUSED_PARAMS(evhdlr_registration_id, status, source, results, nresults);
memset(&affected, 0, sizeof(pmix_proc_t));
if (NULL != info) {
for (n = 0; n < ninfo; n++) {
if (0 == strncmp(info[n].key, PMIX_JOB_TERM_STATUS, PMIX_MAX_KEYLEN)) {
jobstatus = info[n].value.data.status;
} else if (0 == strncmp(info[n].key, PMIX_EVENT_AFFECTED_PROC, PMIX_MAX_KEYLEN)) {
memcpy(&affected, info[n].value.data.proc, sizeof(pmix_proc_t));
} else if (0 == strncmp(info[n].key, PMIX_EVENT_RETURN_OBJECT, PMIX_MAX_KEYLEN)) {
lock = (myrel_t *) info[n].value.data.ptr;
} else if (0 == strncmp(info[n].key, PMIX_EVENT_TEXT_MESSAGE, PMIX_MAX_KEYLEN)) {
msg = info[n].value.data.string;
}
}
}
if (NULL == lock) {
fprintf(stderr, "LOCK WAS NOT RETURNED IN EVENT NOTIFICATION\n");
goto done;
}
lock->lock.status = jobstatus;
if (NULL != msg) {
lock->nspace = strdup(msg);
}
DEBUG_WAKEUP_THREAD(&lock->lock);
done:
if (NULL != cbfunc) {
cbfunc(PMIX_SUCCESS, NULL, 0, NULL, NULL, cbdata);
}
}
static void evhandler_reg_callbk(pmix_status_t status, size_t evhandler_ref, void *cbdata)
{
mylock_t *lock = (mylock_t *) cbdata;
if (PMIX_SUCCESS != status) {
fprintf(stderr, "Client %s:%d EVENT HANDLER REGISTRATION FAILED WITH STATUS %d, ref=%lu\n",
myproc.nspace, myproc.rank, status, (unsigned long) evhandler_ref);
}
lock->status = status;
lock->evhandler_ref = evhandler_ref;
DEBUG_WAKEUP_THREAD(lock);
}
int main(int argc, char **argv)
{
pmix_status_t rc;
pmix_info_t info[3];
pmix_app_t *app;
size_t napps;
myrel_t myrel;
mylock_t mylock;
pmix_status_t code[6] = {PMIX_ERR_PROC_ABORTING,
PMIX_ERR_PROC_ABORTED,
PMIX_ERR_PROC_REQUESTED_ABORT,
PMIX_ERR_JOB_TERMINATED,
PMIX_ERR_UNREACH,
PMIX_ERR_LOST_CONNECTION_TO_SERVER};
pmix_nspace_t appspace;
EXAMPLES_HIDE_UNUSED_PARAMS(argc, argv);
PMIX_INFO_LOAD(&info[0], PMIX_TOOL_DO_NOT_CONNECT, NULL, PMIX_BOOL);
PMIX_INFO_LOAD(&info[1], PMIX_LAUNCHER, NULL, PMIX_BOOL);
PMIX_INFO_LOAD(&info[2], PMIX_IOF_LOCAL_OUTPUT, NULL, PMIX_BOOL);
if (PMIX_SUCCESS != (rc = PMIx_tool_init(&myproc, info, 3))) {
fprintf(stderr, "PMIx_tool_init failed: %d\n", rc);
exit(rc);
}
DEBUG_CONSTRUCT_MYREL(&myrel);
DEBUG_CONSTRUCT_LOCK(&mylock);
PMIX_INFO_LOAD(&info[0], PMIX_EVENT_RETURN_OBJECT, &myrel, PMIX_POINTER);
PMIx_Register_event_handler(code, 6, info, 1, notification_fn, evhandler_reg_callbk,
(void *) &mylock);
DEBUG_WAIT_THREAD(&mylock);
rc = mylock.status;
DEBUG_DESTRUCT_LOCK(&mylock);
if (PMIX_SUCCESS != rc) {
fprintf(stderr, "[%s:%d] Default handler registration failed\n", myproc.nspace,
myproc.rank);
goto done;
}
napps = 1;
PMIX_APP_CREATE(app, napps);
app[0].cmd = strdup("hello");
app[0].argv = (char **) malloc(2 * sizeof(char *));
app[0].argv[0] = strdup("hello");
app[0].argv[1] = NULL;
app[0].maxprocs = 1;
PMIx_Spawn(NULL, 0, app, napps, appspace);
PMIX_APP_FREE(app, napps);
DEBUG_WAIT_THREAD(&myrel.lock);
DEBUG_DESTRUCT_MYREL(&myrel);
done:
PMIx_tool_finalize();
return (0);
}