void initialize(void) { pmDevice *pmd; int error; int ac; char *av[8]; const char **nodes; int nnode; ac = 0; if (conf != NULL) { av[ac++] = "-config"; av[ac++] = conf; } if (firm != NULL) { av[ac++] = "-firmware"; av[ac++] = firm; } if (agent != NULL) { av[ac++] = "-agent"; av[ac++] = agent; } if ((error = pmOpenDevice(type, ac, av, &pmd)) != PM_SUCCESS) { print_error("pmOpenDevice", error); exit(1); } if ((error = pmGetNodeList(pmd, &nodes, &nnode)) != PM_SUCCESS) { print_error("pmGetNodeList", error); exit(1); } if ((error = pmOpenContext(pmd, context, &pmc)) != PM_SUCCESS) { print_error("pmOpenContext", error); exit(1); } if ((error = pmAssociateNodes(pmc, nodes, nnode)) != PM_SUCCESS) { print_error("pmAssociateNodes", error); exit(1); } if ((error = pmBindChannel(pmc, channel)) != PM_SUCCESS) { print_error("pmBindChannel", error); exit(1); } if ((error = pmGetSelf(pmc, &self)) != PM_SUCCESS) { print_error("pmGetSelf", error); exit(1); } }
int send(pmContext *pmc) { caddr_t buf; size_t length; int error; while ((error = pmGetSendBuffer(pmc, dest, &buf, length) == ENOBUFS) { /* * Receive side process should be done to avoid dead lock. */ } if (error != PM_SUCCESS) return (error); /* * Fill buffer */ if ((error = pmSend(pmc)) != PM_SUCCESS) return (error); return (PM_SUCCESS); }
int receive(pmContext *pmc) { caddr_t buf; size_t length; int error; while ((error = pmReceive(pmc, &buf, &length)) == ENOBUFS) ; if (error != PM_SUCCESS) return (error); /* * Process Message */ if ((error = pmReleaseReceiveBuffer(pmc)) != PM_SUCCESS) return (error); return (PM_SUCCESS); }
#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <sys/types.h> #include "pm.h" #ifdef linux #include <asm/byteorder.h> #endif /* linux */ #ifdef sun #define htonl(x) (u_long)(x) #define ntohl(x) (u_long)(x) extern int fprintf(FILE *, char *, ...); #endif /* sun */ void initialize(void); void reply(pmContext *); void pingpong(pmContext *, int, size_t, int); void print_error(char *, int); char *type = PM_MYRINET; char *firm = NULL; char *agent = NULL; char *conf = NULL; int channel = 0; int context = 0; int dest = -1; int length = 8; int iteration = 10000; int reply_flag = 0; int self; pmContext *pmc; int main(int argc, char **argv) { if (argc == 1) { fprintf(stderr, "%s: option\n", argv[0]); exit(1); } for (argc--, argv++; argc > 0; argc--, argv++) { if (strcmp(argv[0], "-reply") == 0) { reply_flag = 1; continue; } if (strcmp(argv[0], "-type") == 0) { type = argv[1]; argc--; argv++; continue; } if (strcmp(argv[0], "-chan") == 0) { channel = atoi(argv[1]); argc--; argv++; continue; } if (strcmp(argv[0], "-context") == 0) { context = atoi(argv[1]); argc--; argv++; continue; } if (strcmp(argv[0], "-dest") == 0) { dest = atoi(argv[1]); argc--; argv++; continue; } if (strcmp(argv[0], "-len") == 0) { length = atoi(argv[1]); argc--; argv++; continue; } if (strcmp(argv[0], "-iter") == 0) { iteration = atoi(argv[1]); argc--; argv++; continue; } if (strcmp(argv[0], "-config") == 0) { conf = argv[1]; argc--; argv++; continue; } if (strcmp(argv[0], "-firmware") == 0) { firm = argv[1]; argc--; argv++; continue; } if (strcmp(argv[0], "-agent") == 0) { agent = argv[1]; argc--; argv++; continue; } fprintf(stderr, "unknown option %s\n", argv[0]); exit(1); } initialize(); if (dest < 0) dest = self; if (reply_flag) reply(pmc); else pingpong(pmc, dest, length, iteration); exit(0); } void initialize(void) { pmDevice *pmd; int error; int ac; char *av[8]; const char **nodes; int nnode; ac = 0; if (conf != NULL) { av[ac++] = "-config"; av[ac++] = conf; } if (firm != NULL) { av[ac++] = "-firmware"; av[ac++] = firm; } if (agent != NULL) { av[ac++] = "-agent"; av[ac++] = agent; } if ((error = pmOpenDevice(type, ac, av, &pmd)) != PM_SUCCESS) { print_error("pmOpenDevice", error); exit(1); } if ((error = pmGetNodeList(pmd, &nodes, &nnode)) != PM_SUCCESS) { print_error("pmGetNodeList", error); exit(1); } if ((error = pmOpenContext(pmd, context, &pmc)) != PM_SUCCESS) { print_error("pmOpenContext", error); exit(1); } if ((error = pmAssociateNodes(pmc, nodes, nnode)) != PM_SUCCESS) { print_error("pmAssociateNodes", error); exit(1); } if ((error = pmBindChannel(pmc, channel)) != PM_SUCCESS) { print_error("pmBindChannel", error); exit(1); } if ((error = pmGetSelf(pmc, &self)) != PM_SUCCESS) { print_error("pmGetSelf", error); exit(1); } } void reply(pmContext *pmc) { int error, dest; caddr_t addr, addr2; size_t length; for (;;) { while ((error = pmReceive(pmc, &addr, &length)) == ENOBUFS) ; if (error != PM_SUCCESS) { print_error("pmReceive", error); exit(1); } dest = ntohl(*(int *)addr); while ((error = pmGetSendBuffer(pmc, dest, &addr2, length)) == ENOBUFS) ; if (error != PM_SUCCESS) { print_error("pmGetSendBuffer", error); exit(1); } *(int *)addr2 = htonl(self); if ((error = pmSend(pmc)) != PM_SUCCESS) { print_error("pmSend", error); exit(1); } if ((error = pmReleaseReceiveBuffer(pmc)) != PM_SUCCESS) { print_error("pmReleaseReceiveBuffer", error); exit(1); } } } void pingpong(pmContext *pmc, int dest, size_t length, int n) { int i, error; caddr_t addr, addr2 = NULL; size_t length2; for (i = 0; i < n; i++) { while ((error = pmGetSendBuffer(pmc, dest, &addr, length)) == ENOBUFS) ; if (error != PM_SUCCESS) { print_error("pmGetSendBuffer", error); exit(1); } *(int *)addr = htonl(self); if ((error = pmSend(pmc)) != PM_SUCCESS) { print_error("pmSend", error); exit(1); } if (addr2 != NULL) { if ((error = pmReleaseReceiveBuffer(pmc)) != PM_SUCCESS) { print_error("pmReleaseReceiveBuffer", error); exit(1); } } while ((error = pmReceive(pmc, &addr2, &length2)) == ENOBUFS) ; if (error != PM_SUCCESS) { print_error("pmReceive", error); exit(1); } } if (addr2 != NULL) { if ((error = pmReleaseReceiveBuffer(pmc)) != PM_SUCCESS) { print_error("pmReleaseReceiveBuffer", error); exit(1); } } } void print_error(char *msg, int error) { fprintf(stderr, "%s: %d(%s)\n", msg, error, pmErrorString(error)); }