diff src/saveload/afterload.cpp @ 12156:292dc6ec679f draft

(svn r16572) -Codechange: also catch FPEs in saveload and the warning about missing NewGRFs; only happens when assertions are disabled and NewGRFs are missing.
author rubidium <rubidium@openttd.org>
date Sat, 13 Jun 2009 12:03:37 +0000
parents b3c5a6c9146a
children 4f649aa97318
line wrap: on
line diff
--- a/src/saveload/afterload.cpp
+++ b/src/saveload/afterload.cpp
@@ -237,7 +237,8 @@
 
 typedef void (CDECL *SignalHandlerPointer)(int);
 static SignalHandlerPointer _prev_segfault = NULL;
-static SignalHandlerPointer _prev_abort = NULL;
+static SignalHandlerPointer _prev_abort    = NULL;
+static SignalHandlerPointer _prev_fpe      = NULL;
 
 static void CDECL HandleSavegameLoadCrash(int signum);
 
@@ -248,7 +249,8 @@
 static void SetSignalHandlers()
 {
 	_prev_segfault = signal(SIGSEGV, HandleSavegameLoadCrash);
-	_prev_abort = signal(SIGABRT, HandleSavegameLoadCrash);
+	_prev_abort    = signal(SIGABRT, HandleSavegameLoadCrash);
+	_prev_fpe      = signal(SIGFPE,  HandleSavegameLoadCrash);
 }
 
 /**
@@ -258,6 +260,7 @@
 {
 	signal(SIGSEGV, _prev_segfault);
 	signal(SIGABRT, _prev_abort);
+	signal(SIGFPE,  _prev_fpe);
 }
 
 /**
@@ -300,7 +303,13 @@
 
 	ShowInfo(buffer);
 
-	SignalHandlerPointer call = signum == SIGSEGV ? _prev_segfault : _prev_abort;
+	SignalHandlerPointer call = NULL;
+	switch (signum) {
+		case SIGSEGV: call = _prev_segfault; break;
+		case SIGABRT: call = _prev_abort; break;
+		case SIGFPE:  call = _prev_fpe; break;
+		default: NOT_REACHED();
+	}
 	if (call != NULL) call(signum);
 }