SDL_fatal.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:4k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.     SDL - Simple DirectMedia Layer
  3.     Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002  Sam Lantinga
  4.     This library is free software; you can redistribute it and/or
  5.     modify it under the terms of the GNU Library General Public
  6.     License as published by the Free Software Foundation; either
  7.     version 2 of the License, or (at your option) any later version.
  8.     This library is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.     Library General Public License for more details.
  12.     You should have received a copy of the GNU Library General Public
  13.     License along with this library; if not, write to the Free
  14.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  15.     Sam Lantinga
  16.     slouken@libsdl.org
  17. */
  18. #ifdef SAVE_RCSID
  19. static char rcsid =
  20.  "@(#) $Id: SDL_fatal.c,v 1.6 2002/04/22 21:38:01 wmay Exp $";
  21. #endif
  22. /* General fatal signal handling code for SDL */
  23. #ifdef NO_SIGNAL_H
  24. /* No signals on this platform, nothing to do.. */
  25. void SDL_InstallParachute(void)
  26. {
  27. return;
  28. }
  29. void SDL_UninstallParachute(void)
  30. {
  31. return;
  32. }
  33. #else
  34. #include <stdlib.h>
  35. #include <stdio.h>
  36. #include <signal.h>
  37. #include <string.h>
  38. #include "SDL.h"
  39. #include "SDL_fatal.h"
  40. #ifdef __CYGWIN__
  41. #define DISABLE_STDIO
  42. #endif
  43. /* This installs some signal handlers for the more common fatal signals,
  44.    so that if the programmer is lazy, the app doesn't die so horribly if
  45.    the program crashes.
  46. */
  47. static void print_msg(const char *text)
  48. {
  49. #ifndef DISABLE_STDIO
  50. fprintf(stderr, "%s", text);
  51. #endif
  52. }
  53. static void SDL_Parachute(int sig)
  54. {
  55. signal(sig, SIG_DFL);
  56. print_msg("Fatal signal: ");
  57. switch (sig) {
  58. case SIGSEGV:
  59. print_msg("Segmentation Fault");
  60. break;
  61. #ifdef SIGBUS
  62. #if SIGBUS != SIGSEGV
  63. case SIGBUS:
  64. print_msg("Bus Error");
  65. break;
  66. #endif
  67. #endif /* SIGBUS */
  68. #ifdef SIGFPE
  69. case SIGFPE:
  70. print_msg("Floating Point Exception");
  71. break;
  72. #endif /* SIGFPE */
  73. #ifdef SIGQUIT
  74. case SIGQUIT:
  75. print_msg("Keyboard Quit");
  76. break;
  77. #endif /* SIGQUIT */
  78. #ifdef SIGPIPE
  79. case SIGPIPE:
  80. print_msg("Broken Pipe");
  81. break;
  82. #endif /* SIGPIPE */
  83. default:
  84. #ifndef DISABLE_STDIO
  85. fprintf(stderr, "# %d", sig);
  86. #endif
  87. break;
  88. }
  89. print_msg(" (SDL Parachute Deployed)n");
  90. SDL_Quit();
  91. exit(-sig);
  92. }
  93. static int SDL_fatal_signals[] = {
  94. SIGSEGV,
  95. #ifdef SIGBUS
  96. SIGBUS,
  97. #endif
  98. #ifdef SIGFPE
  99. SIGFPE,
  100. #endif
  101. #ifdef SIGQUIT
  102. SIGQUIT,
  103. #endif
  104. #ifdef SIGPIPE
  105. SIGPIPE,
  106. #endif
  107. 0
  108. };
  109. void SDL_InstallParachute(void)
  110. {
  111. int i;
  112. void (*ohandler)(int);
  113. /* Set a handler for any fatal signal not already handled */
  114. for ( i=0; SDL_fatal_signals[i]; ++i ) {
  115. ohandler = signal(SDL_fatal_signals[i], SDL_Parachute);
  116. if ( ohandler != SIG_DFL ) {
  117. signal(SDL_fatal_signals[i], ohandler);
  118. }
  119. }
  120. #ifdef SIGALRM
  121. /* Set SIGALRM to be ignored -- necessary on Solaris */
  122. {
  123. struct sigaction action, oaction;
  124. /* Set SIG_IGN action */
  125. memset(&action, 0, (sizeof action));
  126. action.sa_handler = SIG_IGN;
  127. sigaction(SIGALRM, &action, &oaction);
  128. /* Reset original action if it was already being handled */
  129. if ( oaction.sa_handler != SIG_DFL ) {
  130. sigaction(SIGALRM, &oaction, NULL);
  131. }
  132. }
  133. #endif
  134. return;
  135. }
  136. void SDL_UninstallParachute(void)
  137. {
  138. int i;
  139. void (*ohandler)(int);
  140. /* Remove a handler for any fatal signal handled */
  141. for ( i=0; SDL_fatal_signals[i]; ++i ) {
  142. ohandler = signal(SDL_fatal_signals[i], SIG_DFL);
  143. if ( ohandler != SDL_Parachute ) {
  144. signal(SDL_fatal_signals[i], ohandler);
  145. }
  146. }
  147. }
  148. #endif /* NO_SIGNAL_H */