From 04321739c2231a1e24b9bec4fc33726ee7395ee4 Mon Sep 17 00:00:00 2001 From: Hariharan Devarajan Date: Wed, 9 Aug 2023 21:41:56 -0700 Subject: [PATCH] bug fix for multi thread appends --- src/dlio_profiler/writer/chrome_writer.cpp | 27 +++++++++++----------- src/dlio_profiler/writer/chrome_writer.h | 2 +- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/dlio_profiler/writer/chrome_writer.cpp b/src/dlio_profiler/writer/chrome_writer.cpp index 9416ceae..ea830781 100644 --- a/src/dlio_profiler/writer/chrome_writer.cpp +++ b/src/dlio_profiler/writer/chrome_writer.cpp @@ -22,21 +22,11 @@ void dlio_profiler::ChromeWriter::initialize(char *filename, bool throw_error) { void dlio_profiler::ChromeWriter::log(std::string &event_name, std::string &category, TimeResolution &start_time, TimeResolution &duration, std::unordered_map &metadata, int process_id) { - if (is_first_write) { - if (this->fp == NULL) { - fp = fopen(filename.c_str(), "w+"); - } + if (this->fp == nullptr) { + fp = fopen(filename.c_str(), "a+"); if (fp == nullptr) { ERROR(fp == nullptr,"unable to create log file %s", filename.c_str()); - } else { - std::string data = "[\n"; - auto written_elements = fwrite(data.c_str(), data.size(), sizeof(char), fp); - fflush(fp); - if (written_elements != 1) { - ERROR(written_elements != 1, "unable to initialize log file %s", filename.c_str()); - } } - is_first_write = false; } if (fp != nullptr) { std::string json = convert_json(event_name, category, start_time, duration, metadata, process_id); @@ -46,11 +36,21 @@ dlio_profiler::ChromeWriter::log(std::string &event_name, std::string &category, ERROR(written_elements != 1, "unable to write to log file %s", filename.c_str()); } } + is_first_write = false; } void dlio_profiler::ChromeWriter::finalize() { if (fp != nullptr) { - int status = fclose(fp); + int status = fseek(fp, 0, SEEK_SET); + if (status != 0) { + ERROR(status != -1, "unable to seek to start log file %d", filename.c_str()); + } + std::string data = "[\n"; + auto written_elements = fwrite(data.c_str(), data.size(), sizeof(char), fp); + if (written_elements != 1) { + ERROR(written_elements != 1, "unable to initialize log file %s", filename.c_str()); + } + status = fclose(fp); if (status != 0) { ERROR(status != -1, "unable to close log file %d", filename.c_str()); } @@ -74,6 +74,7 @@ dlio_profiler::ChromeWriter::convert_json(std::string &event_name, std::string & } auto start_sec = std::chrono::duration>(start_time); auto duration_sec = std::chrono::duration>(duration); + if (is_first_write) all_stream << " "; all_stream << R"({"name":")" << event_name << "\"," << R"("cat":")" << category << "\"," << "\"pid\":" << pid << "," diff --git a/src/dlio_profiler/writer/chrome_writer.h b/src/dlio_profiler/writer/chrome_writer.h index a03c3f47..18e5570e 100644 --- a/src/dlio_profiler/writer/chrome_writer.h +++ b/src/dlio_profiler/writer/chrome_writer.h @@ -38,7 +38,7 @@ namespace dlio_profiler { return std::string(hostname); } public: - ChromeWriter(FILE* fp=NULL):BaseWriter(), is_first_write(true), mtx_map(){ + ChromeWriter(FILE* fp=nullptr):BaseWriter(), is_first_write(true), mtx_map(){ process_id = getpid(); this->fp = fp; hwloc_topology_init(&topology); // initialization