#2829 Add overall handling of std::bad_alloc exception with a message box. Now the user can know what is happening, and possibly save his work. On linux this will only work sometimes unless sysctl vm.overcommit_memory = 2

This commit is contained in:
Jacob Støren
2018-05-03 09:53:54 +02:00
parent 92fd4183a9
commit 2f80e99abc
3 changed files with 52 additions and 1 deletions

View File

@@ -134,6 +134,40 @@ void AppEnum< RiaApplication::RINavigationPolicy >::setUp()
//==================================================================================================
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RiaApplication::notify(QObject* receiver, QEvent* event)
{
// Pre-allocating a memory exhaustion message
// Doing som e trickery to avoid deadlock, as creating a messagebox actually triggers a call to this notify method.
static QMessageBox* memoryExhaustedBox = nullptr;
static bool allocatingMessageBox = false;
if (!memoryExhaustedBox && !allocatingMessageBox)
{
allocatingMessageBox = true;
memoryExhaustedBox = new QMessageBox(QMessageBox::Critical,
"ResInsight Exhausted Memory",
"Memory is Exhausted!\n ResInsight could not allocate the memory needed, and is now unstable and will probably crash soon.");
}
bool done = true;
try
{
done = QApplication::notify(receiver, event);
}
catch ( const std::bad_alloc& )
{
if (memoryExhaustedBox) memoryExhaustedBox->exec();
std::cout << "ResInsight: Memory is Exhausted!\n ResInsight could not allocate the memory needed, and is now unstable and will probably crash soon." << std::endl;
// If we really want to crash instead of limping forward:
// throw;
}
return done;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------