Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Propagate file renaming to windows
[simgrid.git] / tools / tesh2 / src / signal.c
1 /* $Id: signal.c 3483 2007-05-07 11:18:56Z mquinson $ */
2
3 /* signal -- what TESH needs to know about signals                          */
4
5 /* Copyright (c) 2007 Martin Quinson.                                       */
6 /* All rights reserved.                                                     */
7
8 /* This program is free software; you can redistribute it and/or modify it
9  * under the terms of the license (GNU LGPL) which comes with this package. */
10
11 #include <_signal.h>
12
13 #ifdef WIN32
14 int
15 is_an_unhandled_exception(DWORD exit_code);
16
17 typedef struct s_exception_entry
18 {
19         DWORD value;
20         const char* signal;
21 }s_exception_entry_t,* exception_entry_t;
22    
23 static const s_exception_entry_t exceptions[] =
24 {
25         {EXCEPTION_ACCESS_VIOLATION, "SIGSEGV"},
26         {EXCEPTION_ARRAY_BOUNDS_EXCEEDED, "SIGSEGV"},
27         {EXCEPTION_BREAKPOINT, "SIGTRAP"},
28         {EXCEPTION_DATATYPE_MISALIGNMENT, "SIGBUS"},
29         {EXCEPTION_FLT_DENORMAL_OPERAND, "SIGFPE"},
30         {EXCEPTION_FLT_DIVIDE_BY_ZERO, "SIGFPE"},
31         {EXCEPTION_FLT_INEXACT_RESULT, "SIGFPE"},
32         {EXCEPTION_FLT_INVALID_OPERATION, "SIGFPE"},
33         {EXCEPTION_FLT_OVERFLOW, "SIGFPE"},
34         {EXCEPTION_FLT_STACK_CHECK, "SIGFPE"},
35         {EXCEPTION_FLT_UNDERFLOW, "SIGFPE"},
36         {EXCEPTION_ILLEGAL_INSTRUCTION, "SIGILL"},
37         {EXCEPTION_IN_PAGE_ERROR, "SIGSEGV"},
38         {EXCEPTION_INT_DIVIDE_BY_ZERO, "SIGFPE"},
39         {EXCEPTION_INT_OVERFLOW, "SIGFPE"},
40         {EXCEPTION_STACK_OVERFLOW, "SIGILL"},
41         {EXCEPTION_SINGLE_STEP, "SIGTRAP"},
42         {EXCEPTION_NONCONTINUABLE_EXCEPTION, "SIGILL"},
43         {EXCEPTION_PRIV_INSTRUCTION, "SIGILL"}
44 };
45 /* number of the entries in the table of exceptions */
46 #define MAX_EXECPTION                   ((unsigned int)19)
47
48 #endif
49
50 typedef struct s_signal_entry {
51   const char* name;
52   int number;
53 } s_signal_entry_t,* signal_entry_t;
54
55 static const s_signal_entry_t signals[] = {
56         {"SIGHUP"       ,SIGHUP},
57         {"SIGINT"       ,SIGINT},
58         {"SIGQUIT"      ,SIGQUIT},
59         {"SIGILL"       ,SIGILL},
60         {"SIGTRAP"      ,SIGTRAP},
61         {"SIGABRT"      ,SIGABRT},
62         {"SIGFPE"       ,SIGFPE},
63         {"SIGKILL"      ,SIGKILL},
64         {"SIGBUS"       ,SIGBUS},
65         {"SIGSEGV"      ,SIGSEGV},
66         {"SIGSYS"       ,SIGSYS},
67         {"SIGPIPE"      ,SIGPIPE},
68         {"SIGALRM"      ,SIGALRM},
69         {"SIGTERM"      ,SIGTERM},
70         {"SIGURG"       ,SIGURG},
71         {"SIGSTOP"      ,SIGSTOP},
72         {"SIGTSTP"      ,SIGTSTP},
73         {"SIGCONT"      ,SIGCONT},
74         {"SIGCHLD"      ,SIGCHLD},
75         {"SIGTTIN"      ,SIGTTIN},
76         {"SIGTTOU"      ,SIGTTOU},
77         {"SIGIO"        ,SIGIO},
78         {"SIGXCPU"      ,SIGXCPU},
79         {"SIGXFSZ"      ,SIGXFSZ},
80         {"SIGVTALRM",SIGVTALRM},
81         {"SIGPROF"      ,SIGPROF},
82         {"SIGWINCH"     ,SIGWINCH},
83         {"SIGUSR1"      ,SIGUSR1},
84         {"SIGUSR2"      ,SIGUSR2},
85         {"SIG UNKNOWN"  ,-1}
86 };
87
88 #ifdef WIN32
89 const char* signal_name(DWORD got, char *expected) 
90 #else
91 const char* signal_name(unsigned int got, char *expected) 
92 #endif
93 {
94         int i;
95         
96         #ifdef WIN32
97
98         for (i=0; i < MAX_EXECPTION; i++)
99                 if (exceptions[i].value == got)
100                         return (exceptions[i].signal);
101         #else
102         if((got == SIGBUS) && !strcmp("SIGSEGV",expected))
103                 got = SIGSEGV;
104
105         for (i=0; signals[i].number != -1; i++)
106                 if (signals[i].number == got)
107                         return (signals[i].name);
108         
109         #endif
110         return bprintf("SIG UNKNOWN (%d)", got);
111 }
112
113
114 #ifdef WIN32
115 int
116 is_an_unhandled_exception(DWORD exit_code)
117 {
118         unsigned int i;
119
120         for(i = 0; i < MAX_EXECPTION; i++)
121                 if(exceptions[i].value == exit_code)
122                         return 1;
123         
124         return 0;       
125 }
126 #endif