Mercurial > sdl-ios-xcode
comparison src/SDL_fatal.c @ 1895:c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Mon, 10 Jul 2006 21:04:37 +0000 |
parents | d910939febfa |
children | 99210400e8b9 |
comparison
equal
deleted
inserted
replaced
1894:c69cee13dd76 | 1895:c121d94672cb |
---|---|
33 /* This installs some signal handlers for the more common fatal signals, | 33 /* This installs some signal handlers for the more common fatal signals, |
34 so that if the programmer is lazy, the app doesn't die so horribly if | 34 so that if the programmer is lazy, the app doesn't die so horribly if |
35 the program crashes. | 35 the program crashes. |
36 */ | 36 */ |
37 | 37 |
38 static void SDL_Parachute(int sig) | 38 static void |
39 SDL_Parachute(int sig) | |
39 { | 40 { |
40 signal(sig, SIG_DFL); | 41 signal(sig, SIG_DFL); |
41 SDL_Quit(); | 42 SDL_Quit(); |
42 raise(sig); | 43 raise(sig); |
43 } | 44 } |
44 | 45 |
45 static int SDL_fatal_signals[] = { | 46 static int SDL_fatal_signals[] = { |
46 SIGSEGV, | 47 SIGSEGV, |
47 #ifdef SIGBUS | 48 #ifdef SIGBUS |
48 SIGBUS, | 49 SIGBUS, |
49 #endif | 50 #endif |
50 #ifdef SIGFPE | 51 #ifdef SIGFPE |
51 SIGFPE, | 52 SIGFPE, |
52 #endif | 53 #endif |
53 #ifdef SIGQUIT | 54 #ifdef SIGQUIT |
54 SIGQUIT, | 55 SIGQUIT, |
55 #endif | 56 #endif |
56 0 | 57 0 |
57 }; | 58 }; |
58 | 59 |
59 void SDL_InstallParachute(void) | 60 void |
61 SDL_InstallParachute(void) | |
60 { | 62 { |
61 /* Set a handler for any fatal signal not already handled */ | 63 /* Set a handler for any fatal signal not already handled */ |
62 int i; | 64 int i; |
63 #ifdef HAVE_SIGACTION | 65 #ifdef HAVE_SIGACTION |
64 struct sigaction action; | 66 struct sigaction action; |
65 | 67 |
66 for ( i=0; SDL_fatal_signals[i]; ++i ) { | 68 for (i = 0; SDL_fatal_signals[i]; ++i) { |
67 sigaction(SDL_fatal_signals[i], NULL, &action); | 69 sigaction(SDL_fatal_signals[i], NULL, &action); |
68 if ( action.sa_handler == SIG_DFL ) { | 70 if (action.sa_handler == SIG_DFL) { |
69 action.sa_handler = SDL_Parachute; | 71 action.sa_handler = SDL_Parachute; |
70 sigaction(SDL_fatal_signals[i], &action, NULL); | 72 sigaction(SDL_fatal_signals[i], &action, NULL); |
71 } | 73 } |
72 } | 74 } |
73 #ifdef SIGALRM | 75 #ifdef SIGALRM |
74 /* Set SIGALRM to be ignored -- necessary on Solaris */ | 76 /* Set SIGALRM to be ignored -- necessary on Solaris */ |
75 sigaction(SIGALRM, NULL, &action); | 77 sigaction(SIGALRM, NULL, &action); |
76 if ( action.sa_handler == SIG_DFL ) { | 78 if (action.sa_handler == SIG_DFL) { |
77 action.sa_handler = SIG_IGN; | 79 action.sa_handler = SIG_IGN; |
78 sigaction(SIGALRM, &action, NULL); | 80 sigaction(SIGALRM, &action, NULL); |
79 } | 81 } |
80 #endif | 82 #endif |
81 #else | 83 #else |
82 void (*ohandler)(int); | 84 void (*ohandler) (int); |
83 | 85 |
84 for ( i=0; SDL_fatal_signals[i]; ++i ) { | 86 for (i = 0; SDL_fatal_signals[i]; ++i) { |
85 ohandler = signal(SDL_fatal_signals[i], SDL_Parachute); | 87 ohandler = signal(SDL_fatal_signals[i], SDL_Parachute); |
86 if ( ohandler != SIG_DFL ) { | 88 if (ohandler != SIG_DFL) { |
87 signal(SDL_fatal_signals[i], ohandler); | 89 signal(SDL_fatal_signals[i], ohandler); |
88 } | 90 } |
89 } | 91 } |
90 #endif /* HAVE_SIGACTION */ | 92 #endif /* HAVE_SIGACTION */ |
91 return; | 93 return; |
92 } | 94 } |
93 | 95 |
94 void SDL_UninstallParachute(void) | 96 void |
97 SDL_UninstallParachute(void) | |
95 { | 98 { |
96 /* Remove a handler for any fatal signal handled */ | 99 /* Remove a handler for any fatal signal handled */ |
97 int i; | 100 int i; |
98 #ifdef HAVE_SIGACTION | 101 #ifdef HAVE_SIGACTION |
99 struct sigaction action; | 102 struct sigaction action; |
100 | 103 |
101 for ( i=0; SDL_fatal_signals[i]; ++i ) { | 104 for (i = 0; SDL_fatal_signals[i]; ++i) { |
102 sigaction(SDL_fatal_signals[i], NULL, &action); | 105 sigaction(SDL_fatal_signals[i], NULL, &action); |
103 if ( action.sa_handler == SDL_Parachute ) { | 106 if (action.sa_handler == SDL_Parachute) { |
104 action.sa_handler = SIG_DFL; | 107 action.sa_handler = SIG_DFL; |
105 sigaction(SDL_fatal_signals[i], &action, NULL); | 108 sigaction(SDL_fatal_signals[i], &action, NULL); |
106 } | 109 } |
107 } | 110 } |
108 #else | 111 #else |
109 void (*ohandler)(int); | 112 void (*ohandler) (int); |
110 | 113 |
111 for ( i=0; SDL_fatal_signals[i]; ++i ) { | 114 for (i = 0; SDL_fatal_signals[i]; ++i) { |
112 ohandler = signal(SDL_fatal_signals[i], SIG_DFL); | 115 ohandler = signal(SDL_fatal_signals[i], SIG_DFL); |
113 if ( ohandler != SDL_Parachute ) { | 116 if (ohandler != SDL_Parachute) { |
114 signal(SDL_fatal_signals[i], ohandler); | 117 signal(SDL_fatal_signals[i], ohandler); |
115 } | 118 } |
116 } | 119 } |
117 #endif /* HAVE_SIGACTION */ | 120 #endif /* HAVE_SIGACTION */ |
118 } | 121 } |
119 | 122 |
120 #else | 123 #else |
121 | 124 |
122 /* No signals on this platform, nothing to do.. */ | 125 /* No signals on this platform, nothing to do.. */ |
123 | 126 |
124 void SDL_InstallParachute(void) | 127 void |
128 SDL_InstallParachute(void) | |
125 { | 129 { |
126 return; | 130 return; |
127 } | 131 } |
128 | 132 |
129 void SDL_UninstallParachute(void) | 133 void |
134 SDL_UninstallParachute(void) | |
130 { | 135 { |
131 return; | 136 return; |
132 } | 137 } |
133 | 138 |
134 #endif /* HAVE_SIGNAL_H */ | 139 #endif /* HAVE_SIGNAL_H */ |
140 /* vi: set ts=4 sw=4 expandtab: */ |