Change how fatalMessageBoxThenExit works
This avoids crashing when using Qt : we cannot call exit() safely since QGuiApplication won’t shut down correctly. Instead throw a special marker object and catch this in boostrap. For an instance of this, see: https://sourceforge.net/p/flightgear/codetickets/2070/
This commit is contained in:
parent
222a96503d
commit
ee6f4388ee
3 changed files with 12 additions and 2 deletions
|
@ -191,7 +191,10 @@ MessageBoxResult fatalMessageBoxWithoutExit(const std::string& caption,
|
||||||
int exitStatus)
|
int exitStatus)
|
||||||
{
|
{
|
||||||
fatalMessageBoxWithoutExit(caption, msg, moreText);
|
fatalMessageBoxWithoutExit(caption, msg, moreText);
|
||||||
exit(exitStatus);
|
// we can't use exit() here or QGuiApplication crashes
|
||||||
|
// let's instead throw a sepcial exception which we catch
|
||||||
|
// in boostrap.
|
||||||
|
throw FatalErrorException{};
|
||||||
}
|
}
|
||||||
|
|
||||||
} // of namespace flightgear
|
} // of namespace flightgear
|
||||||
|
|
|
@ -7,6 +7,12 @@
|
||||||
namespace flightgear
|
namespace flightgear
|
||||||
{
|
{
|
||||||
|
|
||||||
|
// special exception class used to signal an exit. Must not inherit
|
||||||
|
// std::exception or similar, since we want to handle it specially
|
||||||
|
class FatalErrorException
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
enum MessageBoxResult
|
enum MessageBoxResult
|
||||||
{
|
{
|
||||||
MSG_BOX_OK,
|
MSG_BOX_OK,
|
||||||
|
|
|
@ -320,9 +320,10 @@ int main ( int argc, char **argv )
|
||||||
flightgear::fatalMessageBoxWithoutExit("Fatal exception", e.what());
|
flightgear::fatalMessageBoxWithoutExit("Fatal exception", e.what());
|
||||||
} catch (const std::string &s) {
|
} catch (const std::string &s) {
|
||||||
flightgear::fatalMessageBoxWithoutExit("Fatal exception", s);
|
flightgear::fatalMessageBoxWithoutExit("Fatal exception", s);
|
||||||
|
} catch (const flightgear::FatalErrorException&) {
|
||||||
|
// we already showed the message box, just carry on to exit
|
||||||
} catch (const char *s) {
|
} catch (const char *s) {
|
||||||
std::cerr << "Fatal error (const char*): " << s << std::endl;
|
std::cerr << "Fatal error (const char*): " << s << std::endl;
|
||||||
|
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
std::cerr << "Unknown exception in the main loop. Aborting..." << std::endl;
|
std::cerr << "Unknown exception in the main loop. Aborting..." << std::endl;
|
||||||
if (errno)
|
if (errno)
|
||||||
|
|
Loading…
Add table
Reference in a new issue