Blame test/mpi/manual/tchandlers.c

Packit 0848f5
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
Packit 0848f5
/*
Packit 0848f5
 *  (C) 2008 by Argonne National Laboratory.
Packit 0848f5
 *      See COPYRIGHT in top-level directory.
Packit 0848f5
 */
Packit 0848f5
/*
Packit 0848f5
   Define _ISOC99_SOURCE to get snprintf() prototype visible in <stdio.h>
Packit 0848f5
   when it is compiled with --enable-stricttest.
Packit 0848f5
*/
Packit 0848f5
#define _ISOC99_SOURCE
Packit 0848f5
Packit 0848f5
#include <signal.h>
Packit 0848f5
#include <time.h>
Packit 0848f5
#include <pthread.h>
Packit 0848f5
#include <limits.h>
Packit 0848f5
#include <string.h>
Packit 0848f5
#include <unistd.h>
Packit 0848f5
#include <stdio.h>
Packit 0848f5
Packit 0848f5
#include "connectstuff.h"
Packit 0848f5
Packit 0848f5
static char sFnameToDelete[PATH_MAX];
Packit 0848f5
static int sWatchdogTimeout = -1;
Packit 0848f5
static size_t sWatchdogStrokeCount = 0;
Packit 0848f5
Packit 0848f5
static void *threadLooper(void *x)
Packit 0848f5
{
Packit 0848f5
    int runTime = 0;
Packit 0848f5
    size_t lastStrokeSeen = sWatchdogStrokeCount;
Packit 0848f5
    /* allow to run for up to 2 minutes */
Packit 0848f5
    while (runTime < sWatchdogTimeout) {
Packit 0848f5
        safeSleep(5);
Packit 0848f5
        runTime += 5;
Packit 0848f5
        if (lastStrokeSeen == sWatchdogStrokeCount) {
Packit 0848f5
            msg("Watchdog not stroked for a while, printing stack: \n");
Packit 0848f5
            printStackTrace();
Packit 0848f5
        }
Packit 0848f5
        lastStrokeSeen = sWatchdogStrokeCount;
Packit 0848f5
    }
Packit 0848f5
    msg("Watchdog about to abort with a timeout after %d\n", runTime);
Packit 0848f5
    _exit(20);
Packit 0848f5
    return NULL;
Packit 0848f5
}
Packit 0848f5
Packit 0848f5
Packit 0848f5
static void term_handler(int sig)
Packit 0848f5
{
Packit 0848f5
    msg("removing file: %s\n", sFnameToDelete);
Packit 0848f5
    unlink(sFnameToDelete);
Packit 0848f5
}
Packit 0848f5
Packit 0848f5
static void segv_handler(int sig)
Packit 0848f5
{
Packit 0848f5
    msg("SEGV detected!\n");
Packit 0848f5
    printStackTrace();
Packit 0848f5
    _exit(10);
Packit 0848f5
}
Packit 0848f5
Packit 0848f5
void indicateConnectSucceeded(void)
Packit 0848f5
{
Packit 0848f5
    char fnameToCreate[PATH_MAX];
Packit 0848f5
    FILE *fp;
Packit 0848f5
    snprintf(fnameToCreate, PATH_MAX, "%s.done", sFnameToDelete);
Packit 0848f5
    msg("Creating file: %s\n", fnameToCreate);
Packit 0848f5
    fp = fopen(fnameToCreate, "wt");
Packit 0848f5
    if (fp != NULL) {
Packit 0848f5
        fclose(fp);
Packit 0848f5
    }
Packit 0848f5
}
Packit 0848f5
Packit 0848f5
void startWatchdog(int seconds)
Packit 0848f5
{
Packit 0848f5
    pthread_t theThread;
Packit 0848f5
    sWatchdogTimeout = seconds;
Packit 0848f5
    msg("Starting watchdog - timeout in %d\n", seconds);
Packit 0848f5
    pthread_create(&theThread, NULL, threadLooper, NULL);
Packit 0848f5
}
Packit 0848f5
Packit 0848f5
void strokeWatchdog()
Packit 0848f5
{
Packit 0848f5
    sWatchdogStrokeCount++;
Packit 0848f5
}
Packit 0848f5
Packit 0848f5
void installSegvHandler(void)
Packit 0848f5
{
Packit 0848f5
    struct sigaction new_action;
Packit 0848f5
    new_action.sa_handler = segv_handler;
Packit 0848f5
    sigemptyset(&new_action.sa_mask);
Packit 0848f5
    new_action.sa_flags = 0;
Packit 0848f5
    sigaction(SIGSEGV, &new_action, NULL);
Packit 0848f5
    msg("Installed SEGV handler\n");
Packit 0848f5
}
Packit 0848f5
Packit 0848f5
void installExitHandler(const char *fname)
Packit 0848f5
{
Packit 0848f5
    /* Install signal handler */
Packit 0848f5
    struct sigaction new_action;
Packit 0848f5
    if (strlen(fname) > PATH_MAX) {
Packit 0848f5
        msg("Fname: <%s> too long - aborting", fname);
Packit 0848f5
        _exit(12);
Packit 0848f5
    }
Packit 0848f5
    strncpy(sFnameToDelete, fname, PATH_MAX);
Packit 0848f5
    new_action.sa_handler = term_handler;
Packit 0848f5
    sigemptyset(&new_action.sa_mask);
Packit 0848f5
    new_action.sa_flags = 0;
Packit 0848f5
    sigaction(SIGINT, &new_action, NULL);
Packit 0848f5
    sigaction(SIGTERM, &new_action, NULL);
Packit 0848f5
    msg("Installed signal handlers\n");
Packit 0848f5
}