diff --git a/simgear/debug/CMakeLists.txt b/simgear/debug/CMakeLists.txt index 886f550c..ce9e3f21 100644 --- a/simgear/debug/CMakeLists.txt +++ b/simgear/debug/CMakeLists.txt @@ -4,11 +4,13 @@ include (SimGearComponent) set(HEADERS debug_types.h logstream.hxx BufferedLogCallback.hxx OsgIoCapture.hxx LogCallback.hxx LogEntry.hxx - ErrorReportingCallback.hxx logdelta.hxx) + ErrorReportingCallback.hxx logdelta.hxx + Reporting.hxx) set(SOURCES logstream.cxx BufferedLogCallback.cxx LogCallback.cxx LogEntry.cxx logdelta.cxx ErrorReportingCallback.cxx + Reporting.cxx ) simgear_component(debug debug "${SOURCES}" "${HEADERS}") diff --git a/simgear/debug/Reporting.cxx b/simgear/debug/Reporting.cxx new file mode 100644 index 00000000..10d5da5e --- /dev/null +++ b/simgear/debug/Reporting.cxx @@ -0,0 +1,24 @@ +#include "Reporting.hxx" + +namespace simgear +{ + +thread_local bool perThread_reportBadAlloc = true; + +ReportBadAllocGuard::ReportBadAllocGuard() +{ + perThread_reportBadAlloc = false; +} + + +ReportBadAllocGuard::~ReportBadAllocGuard() +{ + perThread_reportBadAlloc = true; +} + +bool ReportBadAllocGuard::isSet() +{ + return perThread_reportBadAlloc; +} + +} \ No newline at end of file diff --git a/simgear/debug/Reporting.hxx b/simgear/debug/Reporting.hxx new file mode 100644 index 00000000..f8e420a7 --- /dev/null +++ b/simgear/debug/Reporting.hxx @@ -0,0 +1,16 @@ +#pragma once + +namespace simgear +{ + +class ReportBadAllocGuard +{ +public: + ReportBadAllocGuard(); + ~ReportBadAllocGuard(); + + static bool isSet(); +}; + + +} diff --git a/simgear/io/HTTPRepository.cxx b/simgear/io/HTTPRepository.cxx index edb3e708..8b1d81b6 100644 --- a/simgear/io/HTTPRepository.cxx +++ b/simgear/io/HTTPRepository.cxx @@ -36,6 +36,8 @@ #include "simgear/misc/strutils.hxx" #include +#include + #include #include #include @@ -244,6 +246,7 @@ public: const size_t sizeToCopy = cp.sizeInBytes(); if (buf.size() < sizeToCopy) { try { + simgear::ReportBadAllocGuard g; buf.resize(sizeToCopy); } catch (std::bad_alloc&) { simgear::reportFailure(simgear::LoadFailure::OutOfMemory, simgear::ErrorCode::TerraSync, diff --git a/simgear/scene/model/ModelRegistry.cxx b/simgear/scene/model/ModelRegistry.cxx index f6bcee90..0ea79d60 100644 --- a/simgear/scene/model/ModelRegistry.cxx +++ b/simgear/scene/model/ModelRegistry.cxx @@ -57,6 +57,7 @@ #include #include #include +#include #include @@ -560,6 +561,7 @@ ModelRegistry::readImage(const string& fileName, } try { + simgear::ReportBadAllocGuard g; // REVIEW: Memory Leak - 262,144 bytes in 1 blocks are indirectly lost // The leak occurs with OSG, but may be related to opt being a raw pointer res = registry->readImageImplementation(absFileName, opt); diff --git a/simgear/scene/tgdb/SGReaderWriterBTG.cxx b/simgear/scene/tgdb/SGReaderWriterBTG.cxx index 0ede8db7..c11dab0b 100644 --- a/simgear/scene/tgdb/SGReaderWriterBTG.cxx +++ b/simgear/scene/tgdb/SGReaderWriterBTG.cxx @@ -23,6 +23,7 @@ #include #include +#include #include #include #include @@ -65,6 +66,7 @@ SGReaderWriterBTG::readNode(const std::string& fileName, osg::Node* result = NULL; simgear::ErrorReportContext ec{"btg", fileName}; try { + simgear::ReportBadAllocGuard g; result = SGLoadBTG(fileName, sgOptions); if (!result) return ReadResult::FILE_NOT_HANDLED; diff --git a/simgear/structure/subsystem_mgr.cxx b/simgear/structure/subsystem_mgr.cxx index 0249ccd6..8c9e7624 100644 --- a/simgear/structure/subsystem_mgr.cxx +++ b/simgear/structure/subsystem_mgr.cxx @@ -32,6 +32,7 @@ #include "SGSmplstat.hxx" #include +#include #include #include @@ -840,6 +841,7 @@ SGSubsystemGroup::Member::update (double delta_time_sec) return; } + simgear::ReportBadAllocGuard bg; SGTimeStamp oTimer; try { oTimer.stamp();