From 8dfe453b522f4aba8e43bddd614add515aa3fe40 Mon Sep 17 00:00:00 2001 From: Bryan Bernhart Date: Fri, 17 Jun 2022 16:43:12 -0700 Subject: [PATCH] Fix re-capture bug during shutdown. Events could be still recorded after ShutdownEventTrace which caused the existing trace file to get overwritten with only those events. This fix adds an option to EventTraceWriter to not flush events again when trace is being captured or re-recorded per allocator instance. --- src/gpgmm/common/EventTraceWriter.cpp | 8 ++++++-- src/gpgmm/common/EventTraceWriter.h | 5 ++++- src/gpgmm/common/TraceEvent.cpp | 6 ++++-- src/gpgmm/common/TraceEvent.h | 3 ++- src/gpgmm/d3d12/ResourceAllocatorD3D12.cpp | 6 ++++-- 5 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/gpgmm/common/EventTraceWriter.cpp b/src/gpgmm/common/EventTraceWriter.cpp index 4801fa9d2..e966b0ab0 100644 --- a/src/gpgmm/common/EventTraceWriter.cpp +++ b/src/gpgmm/common/EventTraceWriter.cpp @@ -33,13 +33,17 @@ namespace gpgmm { } void EventTraceWriter::SetConfiguration(const std::string& traceFile, - const TraceEventPhase& ignoreMask) { + const TraceEventPhase& ignoreMask, + bool flushOnDestruct) { mTraceFile = (traceFile.empty()) ? mTraceFile : traceFile; mIgnoreMask = ignoreMask; + mFlushOnDestruct = flushOnDestruct; } EventTraceWriter::~EventTraceWriter() { - FlushQueuedEventsToDisk(); + if (mFlushOnDestruct) { + FlushQueuedEventsToDisk(); + } } void EventTraceWriter::EnqueueTraceEvent(char phase, diff --git a/src/gpgmm/common/EventTraceWriter.h b/src/gpgmm/common/EventTraceWriter.h index 00a7554e2..ed9ad36cc 100644 --- a/src/gpgmm/common/EventTraceWriter.h +++ b/src/gpgmm/common/EventTraceWriter.h @@ -30,7 +30,9 @@ namespace gpgmm { public: EventTraceWriter(); - void SetConfiguration(const std::string& traceFile, const TraceEventPhase& ignoreMask); + void SetConfiguration(const std::string& traceFile, + const TraceEventPhase& ignoreMask, + bool flushOnDestruct); ~EventTraceWriter(); @@ -54,6 +56,7 @@ namespace gpgmm { mBufferPerThread; TraceEventPhase mIgnoreMask; + bool mFlushOnDestruct = true; }; } // namespace gpgmm diff --git a/src/gpgmm/common/TraceEvent.cpp b/src/gpgmm/common/TraceEvent.cpp index 2cfb9479d..4b6adca07 100644 --- a/src/gpgmm/common/TraceEvent.cpp +++ b/src/gpgmm/common/TraceEvent.cpp @@ -33,12 +33,14 @@ namespace gpgmm { return gEventTrace.get(); } - void StartupEventTrace(const std::string& traceFile, const TraceEventPhase& ignoreMask) { + void StartupEventTrace(const std::string& traceFile, + const TraceEventPhase& ignoreMask, + bool flushOnDestruct) { #if defined(GPGMM_DISABLE_TRACING) gpgmm::WarningLog() << "Event tracing enabled but unable to record due to GPGMM_DISABLE_TRACING."; #endif - GetInstance()->SetConfiguration(traceFile, ignoreMask); + GetInstance()->SetConfiguration(traceFile, ignoreMask, flushOnDestruct); TRACE_EVENT_METADATA1(TraceEventCategory::Metadata, "thread_name", "name", "GPGMM_MainThread"); } diff --git a/src/gpgmm/common/TraceEvent.h b/src/gpgmm/common/TraceEvent.h index 571e92f89..21b7f3a62 100644 --- a/src/gpgmm/common/TraceEvent.h +++ b/src/gpgmm/common/TraceEvent.h @@ -172,7 +172,8 @@ namespace gpgmm { class PlatformTime; void StartupEventTrace(const std::string& traceFile, - const TraceEventPhase& ignoreMask); + const TraceEventPhase& ignoreMask, + bool flushOnDestruct); void ShutdownEventTrace(); diff --git a/src/gpgmm/d3d12/ResourceAllocatorD3D12.cpp b/src/gpgmm/d3d12/ResourceAllocatorD3D12.cpp index a2acec6c4..761942d34 100644 --- a/src/gpgmm/d3d12/ResourceAllocatorD3D12.cpp +++ b/src/gpgmm/d3d12/ResourceAllocatorD3D12.cpp @@ -343,8 +343,10 @@ namespace gpgmm::d3d12 { } if (newDescriptor.RecordOptions.Flags != ALLOCATOR_RECORD_FLAG_NONE) { - StartupEventTrace(descriptor.RecordOptions.TraceFile, - static_cast(~newDescriptor.RecordOptions.Flags | 0)); + StartupEventTrace( + descriptor.RecordOptions.TraceFile, + static_cast(~newDescriptor.RecordOptions.Flags | 0), + descriptor.RecordOptions.EventScope & ALLOCATOR_RECORD_SCOPE_PER_PROCESS); SetEventMessageLevel(GetLogSeverity(newDescriptor.RecordOptions.MinMessageLevel)); }