File: mono-hang-watchdog.c

package info (click to toggle)
mono 6.14.1%2Bds2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,282,732 kB
  • sloc: cs: 11,182,461; xml: 2,850,281; ansic: 699,123; cpp: 122,919; perl: 58,604; javascript: 30,841; asm: 21,845; makefile: 19,602; sh: 10,973; python: 4,772; pascal: 925; sql: 859; sed: 16; php: 1
file content (47 lines) | stat: -rw-r--r-- 1,293 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/* Given a external process' id as argument, the program waits for a set timeout then attempts to abort that process */
/* Used by the Mono runtime's crash reporting. */

#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <errno.h>
#include <unistd.h>
#include "config.h"
#include <signal.h>

#define TIMEOUT 30

static char* program_name;
void program_exit (int exit_code, const char* message);

int main (int argc, char* argv[])
{
    program_name = argv [0];
    if (argc != 2)
        program_exit (1, "Please provide one argument (pid)");
    errno = 0;
    pid_t pid = (pid_t)strtoul (argv [1], NULL, 10);
    if (errno)
        program_exit (2, "Invalid pid");

    sleep (TIMEOUT);

    /* if we survived the timeout, we consider the Mono process as hung */

#ifndef HAVE_KILL
    /* just inform the user */
    printf ("Mono process with pid %lu appears to be hung", (unsigned long)pid);
    return 0;
#else
    printf ("Mono process hang detected, sending kill signal to pid %lu\n", (unsigned long)pid);
    return kill (pid, SIGKILL);
#endif
}

void program_exit (int exit_code, const char* message)
{
    if (message)
        printf ("%s\n", message);
    printf ("Usage: '%s [pid]'\t\t[pid]: The id for the Mono process\n", program_name);
    exit (exit_code);
}