Changeset - r12151:418d1c5ad525
[Not reviewed]
master
0 1 0
rubidium - 15 years ago 2009-06-13 12:03:37
rubidium@openttd.org
(svn r16572) -Codechange: also catch FPEs in saveload and the warning about missing NewGRFs; only happens when assertions are disabled and NewGRFs are missing.
1 file changed with 12 insertions and 3 deletions:
0 comments (0 inline, 0 general)
src/saveload/afterload.cpp
Show inline comments
 
@@ -237,7 +237,8 @@ static bool InitializeWindowsAndCaches()
 

	
 
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 CDECL HandleSavegameLoadCras
 
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 @@ static void ResetSignalHandlers()
 
{
 
	signal(SIGSEGV, _prev_segfault);
 
	signal(SIGABRT, _prev_abort);
 
	signal(SIGFPE,  _prev_fpe);
 
}
 

	
 
/**
 
@@ -300,7 +303,13 @@ static void CDECL HandleSavegameLoadCras
 

	
 
	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);
 
}
 

	
0 comments (0 inline, 0 general)