/*
Failure notification example
Demonstrates how to tell when a task exits
*/
/* defines and prototypes for the PVM library */
#include <pvm3.h>
/* Maximum number of children this program will spawn */
#define MAXNCHILD 20
/* Tag to use for the task done message */
#define TASKDIED 11
int
main(int argc, char* argv[])
{
/* number of tasks to spawn, use 3 as the default */
int ntask = 3;
/* return code from pvm calls */
int info;
/* my task id */
int mytid;
/* my parents task id */
int myparent;
/* children task id array */
int child[MAXNCHILD];
int i, deadtid;
int tid;
char *argv[5];
/* find out my task id number */
mytid = pvm_mytid();
/* check for error */
if (mytid < 0) {
/* print out the error */
pvm_perror(argv[0]);
/* exit the program */
return -1;
}
/* find my parent's task id number */
myparent = pvm_parent();
/* exit if there is some error other than PvmNoParent */
if ((myparent < 0) && (myparent != PvmNoParent)) {
pvm_perror(argv[0]);
pvm_exit();
return -1;
}
/* if i don't have a parent then i am the parent */
if (myparent == PvmNoParent) {
/* find out how many tasks to spawn */
if (argc == 2) ntask = atoi(argv[1]);
/* make sure ntask is legal */
if ((ntask < 1) || (ntask > MAXNCHILD)) { pvm_exit(); return 0; }
/* spawn the child tasks */
info = pvm_spawn(argv[0], (char**)0, PvmTaskDebug, (char*)0,
ntask, child);
/* make sure spawn succeeded */
if (info != ntask) { pvm_exit(); return -1; }
/* print the tids */
for (i = 0; i < ntask; i++) printf("t%x\t",child[i]); putchar('\n');
/* ask for notification when child exits */
info = pvm_notify(PvmTaskExit, TASKDIED, ntask, child);
if (info < 0) { pvm_perror("notify"); pvm_exit(); return -1; }
/* reap the middle child */
info = pvm_kill(child[ntask/2]);
if (info < 0) { pvm_perror("kill"); pvm_exit(); return -1; }
/* wait for the notification */
info = pvm_recv(-1, TASKDIED);
if (info < 0) { pvm_perror("recv"); pvm_exit(); return -1; }
info = pvm_upkint(&deadtid, 1, 1);
if (info < 0) pvm_perror("calling pvm_upkint");
/* should be the middle child */
printf("Task t%x has exited.\n", deadtid);
printf("Task t%x is middle child.\n", child[ntask/2]);
pvm_exit();
return 0;
}
/* i'm a child */
sleep(63);
pvm_exit();
return 0;
}