Don't call fatalMessageBox() from fg_terminate(), make it end with std::abort()
Basically, this is because fatalMessageBox() is only safe to call from the GUI thread, however it seems fg_terminate() can be called from any thread (according to C++11 semantics). Additionally, fatalMessageBox() typically requires some work to happen in the GUI thread (event loop) in order to display something, but we can't realistically expect this while running a terminate handler just before the program dies. See messages around <https://sourceforge.net/p/flightgear/mailman/message/35775803/> for a discussion of this subject. + Minor header cleanup (<locale.h> replaced with <clocale>, etc.)
This commit is contained in:
parent
5e5699c4d8
commit
5040e6c7f0
1 changed files with 10 additions and 8 deletions
|
@ -44,13 +44,13 @@
|
||||||
# include <unistd.h> // for gethostname()
|
# include <unistd.h> // for gethostname()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <cstring>
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <locale.h>
|
#include <cerrno>
|
||||||
|
#include <csignal>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstring>
|
||||||
|
#include <clocale>
|
||||||
|
|
||||||
#include <simgear/compiler.h>
|
#include <simgear/compiler.h>
|
||||||
#include <simgear/structure/exception.hxx>
|
#include <simgear/structure/exception.hxx>
|
||||||
|
@ -188,9 +188,11 @@ void segfault_handler(int signo) {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void fg_terminate()
|
[[noreturn]] static void fg_terminate()
|
||||||
{
|
{
|
||||||
flightgear::fatalMessageBox("Fatal exception", "Uncaught exception on some thread");
|
cerr << "Running FlightGear's terminate handler. The program is going to "
|
||||||
|
"exit due to a fatal error condition, sorry." << std::endl;
|
||||||
|
std::abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Detect SSE2 support for x86, it is always available for x86_64
|
// Detect SSE2 support for x86, it is always available for x86_64
|
||||||
|
|
Loading…
Reference in a new issue