/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * (C) 2008 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. */ /* Define _ISOC99_SOURCE to get snprintf() prototype visible in when it is compiled with --enable-stricttest. */ #define _ISOC99_SOURCE #include #include #include #include #include #include #include #include #include #include #include "mpi.h" #include "connectstuff.h" static void printTimeStamp(void) { time_t t; struct tm *ltime; time(&t); ltime = localtime(&t); printf("%04d-%02d-%02d %02d:%02d:%02d: ", 1900 + ltime->tm_year, ltime->tm_mon, ltime->tm_mday, ltime->tm_hour, ltime->tm_min, ltime->tm_sec); fflush(stdout); } void safeSleep(double seconds) { struct timespec sleepAmt = { 0, 0 }; int ret = 0; sleepAmt.tv_sec = floor(seconds); sleepAmt.tv_nsec = 1e9 * (seconds - floor(seconds)); ret = nanosleep(&sleepAmt, NULL); if (ret == -1) { printf("Safesleep returned early. Sorry\n"); } } void printStackTrace() { static char cmd[512]; int ierr; snprintf(cmd, 512, "/bin/sh -c \"/home/eellis/bin/pstack1 %d\"", getpid()); ierr = system(cmd); fflush(stdout); } void msg(const char *fmt, ...) { va_list ap; va_start(ap, fmt); printTimeStamp(); vprintf(fmt, ap); fflush(stdout); va_end(ap); } /* * You should free the string once you've used it */ char *getPortFromFile(const char *fmt, ...) { char fname[PATH_MAX]; char dirname[PATH_MAX]; char *retPort; char *cerr; va_list ap; FILE *fp; int done = 0; int count = 0; /* Just used for the NFS sync - not really a count */ retPort = (char *) calloc(MPI_MAX_PORT_NAME + 1, sizeof(char)); va_start(ap, fmt); vsnprintf(fname, PATH_MAX, fmt, ap); va_end(ap); srand(getpid()); while (!done) { count += rand(); fp = fopen(fname, "rt"); if (fp != NULL) { cerr = fgets(retPort, MPI_MAX_PORT_NAME, fp); fclose(fp); /* ignore bogus tag - assume that the real tag must be longer than 8 * characters */ if (strlen(retPort) >= 8) { done = 1; } } if (!done) { int retcode; safeSleep(0.1); /* force NFS to update by creating and then deleting a subdirectory. Ouch. */ snprintf(dirname, PATH_MAX, "%s___%d", fname, count); retcode = mkdir(dirname, 0777); if (retcode != 0) { perror("Calling mkdir"); _exit(9); } else { rmdir(dirname); } } } return retPort; } /* * Returns the filename written to. Free this once you're done. */ char *writePortToFile(const char *port, const char *fmt, ...) { char *fname; va_list ap; FILE *fp; fname = (char *) calloc(PATH_MAX, sizeof(char)); va_start(ap, fmt); vsnprintf(fname, PATH_MAX, fmt, ap); va_end(ap); fp = fopen(fname, "wt"); fprintf(fp, "%s\n", port); fclose(fp); msg("Wrote port <%s> to file <%s>\n", port, fname); return fname; }