Blame test/mpi/manual/tcutil.c

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