LAM/MPI logo

Performance Issues with LAM on Linux 2.2.x

  |   Home   |   Download   |   Documentation   |   FAQ   |  

mrw.cc

#include <errno.h> #include <signal.h> #include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/stat.h> #include <sys/wait.h> #include <sys/uio.h> #include <netinet/in.h> #include <netdb.h> #include <fcntl.h> /* * Stolen from the LAM/MPI 6.2 distribution * http://www.lam-mpi.org/ */ int mreadv(int fd, struct iovec *iov, int iovcnt) { int nread; /* # of bytes read */ int r; int savelen; /* save full length */ void *savebase; /* save original base ptr */ nread = 0; if (iovcnt > 0) { savelen = iov->iov_len; savebase = iov->iov_base; } do { r = readv(fd, iov, iovcnt); if (r < 0) { if (errno != EINTR) { iov->iov_len = savelen; iov->iov_base = (char*) savebase; return(-1); } } else if (r == 0) { /* eof */ iov->iov_len = savelen; iov->iov_base = (char*) savebase; while ((iovcnt > 0) && (iov->iov_len == 0)) { iov++; iovcnt--; } if (iovcnt > 0) { errno = 3; } return((int) nread); } else { nread += r; while (r > 0) { if (r >= iov->iov_len) { r -= iov->iov_len; iov->iov_len = savelen; iov->iov_base = (char*) savebase; iov++; iovcnt--; if (iovcnt > 0) { savelen = iov->iov_len; savebase = iov->iov_base; } } else { iov->iov_len -= r; iov->iov_base = (char *) iov->iov_base + r; r = 0; } } while ((iovcnt > 0) && (iov->iov_len == 0)) { iov++; iovcnt--; if (iovcnt > 0) { savelen = iov->iov_len; savebase = iov->iov_base; } } } } while (iovcnt > 0); return((int) nread); } int mwritev(int fd, struct iovec *iov, int iovcnt) { int nwritten; /* # of bytes written */ int r; int savelen; /* save full length */ void *savebase; /* save original base ptr */ nwritten = 0; if (iovcnt > 0) { savelen = iov->iov_len; savebase = iov->iov_base; } do { r = writev(fd, iov, iovcnt); if (r < 0) { if (errno != EINTR) { iov->iov_len = savelen; iov->iov_base = (char *) savebase; return(-1); } } else if (r == 0) { /* eof */ iov->iov_len = savelen; iov->iov_base = (char*) savebase; while ((iovcnt > 0) && (iov->iov_len == 0)) { iov++; iovcnt--; } if (iovcnt > 0) { errno = 3; } return((int) nwritten); } else { nwritten += r; while (r > 0) { if (r >= iov->iov_len) { r -= iov->iov_len; iov->iov_len = savelen; iov->iov_base = (char *)savebase; iov++; iovcnt--; if (iovcnt > 0) { savelen = iov->iov_len; savebase = iov->iov_base; } } else { iov->iov_len -= r; iov->iov_base = (char *) iov->iov_base + r; r = 0; } } while ((iovcnt > 0) && (iov->iov_len == 0)) { iov++; iovcnt--; if (iovcnt > 0) { savelen = iov->iov_len; savebase = iov->iov_base; } } } } while (iovcnt > 0); return((int) nwritten); }