From afb1a331227269b74cf64dce35e450dae1297227 Mon Sep 17 00:00:00 2001 From: Arkadiusz Bokowy Date: Thu, 19 Sep 2024 16:28:29 +0200 Subject: [PATCH] Tracing: Create leading directories if they don't exist (#35668) --- src/controller/python/chip/tracing/TracingSetup.cpp | 2 +- src/controller/python/chip/tracing/__init__.py | 3 --- src/tracing/json/json_tracing.cpp | 11 ++++++++++- src/tracing/perfetto/file_output.cpp | 9 +++++++++ 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/controller/python/chip/tracing/TracingSetup.cpp b/src/controller/python/chip/tracing/TracingSetup.cpp index 73e0633b3bf373..76e9ac1527de06 100644 --- a/src/controller/python/chip/tracing/TracingSetup.cpp +++ b/src/controller/python/chip/tracing/TracingSetup.cpp @@ -34,7 +34,7 @@ chip::Tracing::Perfetto::PerfettoBackend gPerfettoBackend; } // namespace -extern "C" void pychip_tracing_start_json_log(const char * file_name) +extern "C" void pychip_tracing_start_json_log() { chip::MainLoopWork::ExecuteInMainLoop([] { gJsonBackend.CloseFile(); // just in case, ensure no file output diff --git a/src/controller/python/chip/tracing/__init__.py b/src/controller/python/chip/tracing/__init__.py index fc6ee35f3b1bb9..1d2add7f0b5522 100644 --- a/src/controller/python/chip/tracing/__init__.py +++ b/src/controller/python/chip/tracing/__init__.py @@ -115,9 +115,6 @@ def StartFromString(self, destination: str): else: raise ValueError("Invalid trace-to destination: %r", destination) - def __init__(self): - pass - def __enter__(self): return self diff --git a/src/tracing/json/json_tracing.cpp b/src/tracing/json/json_tracing.cpp index 4531740b81a193..e719f1f6dc12a5 100644 --- a/src/tracing/json/json_tracing.cpp +++ b/src/tracing/json/json_tracing.cpp @@ -31,6 +31,7 @@ #include +#include #include #include @@ -461,8 +462,16 @@ void JsonBackend::CloseFile() CHIP_ERROR JsonBackend::OpenFile(const char * path) { CloseFile(); - mOutputFile.open(path, std::ios_base::out); + std::error_code ec; + std::filesystem::path filePath(path); + // Create directories if they don't exist + if (!std::filesystem::create_directories(filePath.remove_filename(), ec)) + { + return CHIP_ERROR_POSIX(ec.value()); + } + + mOutputFile.open(path, std::ios_base::out); if (!mOutputFile) { return CHIP_ERROR_POSIX(errno); diff --git a/src/tracing/perfetto/file_output.cpp b/src/tracing/perfetto/file_output.cpp index d9ac3e87781a3c..b54d11d9ae3c28 100644 --- a/src/tracing/perfetto/file_output.cpp +++ b/src/tracing/perfetto/file_output.cpp @@ -24,6 +24,7 @@ #include #include +#include namespace chip { namespace Tracing { @@ -37,6 +38,14 @@ CHIP_ERROR FileTraceOutput::Open(const char * file_name) // Close any existing files Close(); + std::error_code ec; + std::filesystem::path filePath(file_name); + // Create directories if they don't exist + if (!std::filesystem::create_directories(filePath.remove_filename(), ec)) + { + return CHIP_ERROR_POSIX(ec.value()); + } + // Create a trace file and start sending data to it mTraceFileId = open(file_name, O_RDWR | O_CREAT | O_TRUNC, 0640); if (mTraceFileId < 0)