Logo AND Algorithmique Numérique Distribuée

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