#include #include #include #include #include #include "pvm3.h" #define SELF "sspmd" #define TIDTAG 17 #define TOKTAG 13 int main(void){ int mytid, me, daddy, numt, i; int nproc = 10, nchild = nproc - 1, tids[nproc]; long start_time = time(NULL); mytid = pvm_mytid(); daddy = pvm_parent(); if(daddy == PvmNoParent){ /* parent code */ me = 0; tids[0] = mytid; printf("i'm daddy with tid %d\n", tids[0]); printf("spawning at t = %ld\n", time(NULL) - start_time); numt = pvm_spawn(SELF, NULL, 0, "", nchild, &tids[1]); if(numt < nchild){ printf("Aborting. Error codes are:\n"); for(i = numt ; i < nchild ; i++) { printf("TID %d %d\n", i, tids[i]); } for(i = 1; i < numt; i++){ pvm_kill(tids[i]); } pvm_exit(); exit(EXIT_FAILURE); } pvm_initsend(PvmDataDefault); pvm_pkint(&nproc, 1, 1); pvm_pkint(tids, nproc, 1); pvm_pklong(&start_time, 1, 1); pvm_mcast(&tids[1], nchild, TIDTAG); } else { /* child code */ pvm_recv(daddy, TIDTAG); pvm_upkint(&nproc, 1, 1); pvm_upkint(tids, nproc, 1); pvm_upklong(&start_time, 1, 1); /* Determine which slave I am (1 -- nproc-1) */ for(i = 1; i < nproc ; i++) if(mytid == tids[i]){ me = i; break; } printf("i'm child %d with tid %d at time = %ld\n", i, tids[i], time(NULL) - start_time); } /* ring code */ { int token = 58; int dst = (me == (nproc - 1)) ? 0 : me + 1; int src = (me == 0) ? (nproc - 1) : me - 1; if(me == 0){ pvm_initsend(PvmDataDefault ); printf("sending token around the ring at time = %ld\n", time(NULL) - start_time); pvm_pkint(&token, 1, 1); pvm_send(tids[dst], TOKTAG ); pvm_recv(tids[src], TOKTAG ); printf("token arrived back safely at time = %ld\n", time(NULL) - start_time); } else { pvm_recv(tids[src], TOKTAG ); pvm_upkint(&token, 1, 1); printf("i'm child %d and i got token %d at time = %ld\n", i, token, time(NULL) - start_time); // sleep(1); pvm_initsend(PvmDataDefault ); pvm_pkint(&token, 1, 1); pvm_send(tids[dst],TOKTAG ); } pvm_exit(); exit(EXIT_SUCCESS); } }