Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/wolfpld/tracy.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBartosz Taudul <wolf@nereid.pl>2021-03-10 00:10:29 +0300
committerBartosz Taudul <wolf@nereid.pl>2021-03-10 00:19:42 +0300
commit8dd92f32af91e9a8243f80c9c67a343d23a0e817 (patch)
tree301cf9cbe779d240bba25e1f1cc0d710e64579f7
parent4846b4f4504ecffeb2b063d1bf4c5202293d549a (diff)
Handle memory double allocation failure.
-rw-r--r--server/TracyWorker.cpp21
-rw-r--r--server/TracyWorker.hpp2
2 files changed, 18 insertions, 5 deletions
diff --git a/server/TracyWorker.cpp b/server/TracyWorker.cpp
index 49f95d46..7cb74857 100644
--- a/server/TracyWorker.cpp
+++ b/server/TracyWorker.cpp
@@ -4627,6 +4627,13 @@ void Worker::MemFreeFailure( uint64_t thread )
m_failureData.callstack = m_serialNextCallstack;
}
+void Worker::MemAllocTwiceFailure( uint64_t thread )
+{
+ m_failure = Failure::MemAllocTwice;
+ m_failureData.thread = thread;
+ m_failureData.callstack = m_serialNextCallstack;
+}
+
void Worker::FrameEndFailure()
{
m_failure = Failure::FrameEnd;
@@ -5510,13 +5517,18 @@ void Worker::ProcessGpuContextName( const QueueGpuContextName& ev )
MemEvent* Worker::ProcessMemAllocImpl( uint64_t memname, MemData& memdata, const QueueMemAlloc& ev )
{
+ if( memdata.active.find( ev.ptr ) != memdata.active.end() )
+ {
+ MemAllocTwiceFailure( ev.thread );
+ return nullptr;
+ }
+
const auto refTime = m_refTimeSerial + ev.time;
m_refTimeSerial = refTime;
const auto time = TscTime( refTime - m_data.baseTime );
if( m_data.lastTime < time ) m_data.lastTime = time;
NoticeThread( ev.thread );
- assert( memdata.active.find( ev.ptr ) == memdata.active.end() );
assert( memdata.data.empty() || memdata.data.back().TimeAlloc() <= time );
memdata.active.emplace( ev.ptr, memdata.data.size() );
@@ -5625,9 +5637,8 @@ MemEvent* Worker::ProcessMemFreeNamed( const QueueMemFree& ev )
void Worker::ProcessMemAllocCallstack( const QueueMemAlloc& ev )
{
auto mem = ProcessMemAlloc( ev );
- assert( mem );
assert( m_serialNextCallstack != 0 );
- mem->SetCsAlloc( m_serialNextCallstack );
+ if( mem ) mem->SetCsAlloc( m_serialNextCallstack );
m_serialNextCallstack = 0;
}
@@ -5644,9 +5655,8 @@ void Worker::ProcessMemAllocCallstackNamed( const QueueMemAlloc& ev )
it->second->name = memname;
}
auto mem = ProcessMemAllocImpl( memname, *it->second, ev );
- assert( mem );
assert( m_serialNextCallstack != 0 );
- mem->SetCsAlloc( m_serialNextCallstack );
+ if( mem ) mem->SetCsAlloc( m_serialNextCallstack );
m_serialNextCallstack = 0;
}
@@ -7408,6 +7418,7 @@ static const char* s_failureReasons[] = {
"Zone color transfer destination doesn't match active zone.",
"Zone name transfer destination doesn't match active zone.",
"Memory free event without a matching allocation.",
+ "Memory allocation event was reported for an address that is already tracked and not freed.",
"Discontinuous frame begin/end mismatch.",
"Frame image offset is invalid.",
"Multiple frame images were sent for a single frame.",
diff --git a/server/TracyWorker.hpp b/server/TracyWorker.hpp
index b00e9498..78830a03 100644
--- a/server/TracyWorker.hpp
+++ b/server/TracyWorker.hpp
@@ -389,6 +389,7 @@ public:
ZoneColor,
ZoneName,
MemFree,
+ MemAllocTwice,
FrameEnd,
FrameImageIndex,
FrameImageTwice,
@@ -688,6 +689,7 @@ private:
void ZoneColorFailure( uint64_t thread );
void ZoneNameFailure( uint64_t thread );
void MemFreeFailure( uint64_t thread );
+ void MemAllocTwiceFailure( uint64_t thread );
void FrameEndFailure();
void FrameImageIndexFailure();
void FrameImageTwiceFailure();