[PATCH 2/3] record: Only create necessary stream files

Sebastian Huber sebastian.huber at embedded-brains.de
Wed Sep 4 05:18:39 UTC 2019


Rename the files to stream_* so that they appear after the metadata
file.  This makes it easier to open a new trace in Trace Compass.

Update #3665.
---
 trace/record/record-main-lttng.cc | 48 ++++++++++++++++++++++++++-------------
 1 file changed, 32 insertions(+), 16 deletions(-)

diff --git a/trace/record/record-main-lttng.cc b/trace/record/record-main-lttng.cc
index be2406d..3315bd2 100644
--- a/trace/record/record-main-lttng.cc
+++ b/trace/record/record-main-lttng.cc
@@ -119,9 +119,10 @@ class LTTNGClient : public Client {
     pkt_ctx_.header.ctf_magic = CTF_MAGIC;
   }
 
-  void OpenStreamFiles();
-
-  void CloseStreamFiles();
+  void Destroy() {
+    Client::Destroy();
+    CloseStreamFiles();
+  }
 
  private:
   PerCPUContext per_cpu_[RTEMS_RECORD_CLIENT_MAXIMUM_CPU_COUNT];
@@ -136,6 +137,8 @@ class LTTNGClient : public Client {
 
   PacketContext pkt_ctx_;
 
+  size_t cpu_count_ = 0;
+
   static rtems_record_client_status HandlerCaller(uint64_t bt,
                                                   uint32_t cpu,
                                                   rtems_record_event event,
@@ -159,6 +162,10 @@ class LTTNGClient : public Client {
   void AddThreadName(PerCPUContext* pcpu, const ClientItem& item);
 
   void PrintItem(const ClientItem& item);
+
+  void OpenStreamFiles(uint64_t data);
+
+  void CloseStreamFiles();
 };
 
 static uint32_t GetAPIIndexOfID(uint32_t id) {
@@ -273,6 +280,9 @@ void LTTNGClient::PrintItem(const ClientItem& item) {
     case RTEMS_RECORD_THREAD_NAME:
       AddThreadName(&pcpu, item);
       break;
+    case RTEMS_RECORD_PROCESSOR_MAXIMUM:
+      OpenStreamFiles(item.data);
+      break;
     default:
       break;
   }
@@ -294,19 +304,25 @@ rtems_record_client_status LTTNGClient::Handler(uint64_t bt,
   return RTEMS_RECORD_CLIENT_SUCCESS;
 }
 
-void LTTNGClient::OpenStreamFiles() {
-  for (size_t i = 0; i < RTEMS_RECORD_CLIENT_MAXIMUM_CPU_COUNT; ++i) {
-    char filename[256];
-    snprintf(filename, sizeof(filename), "event_%zu", i);
-    FILE* f = fopen(filename, "wb");
-    assert(f != NULL);
+void LTTNGClient::OpenStreamFiles(uint64_t data) {
+  // Assertions are ensured by C record client
+  assert(cpu_count_ == 0 && data < RTEMS_RECORD_CLIENT_MAXIMUM_CPU_COUNT);
+  cpu_count_ = static_cast<size_t>(data) + 1;
+
+  for (size_t i = 0; i < cpu_count_; ++i) {
+    std::string filename("stream_");
+    filename += std::to_string(i);
+    FILE* f = fopen(filename.c_str(), "wb");
+    if (f == NULL) {
+      throw ErrnoException("cannot create file '" + filename + "'");
+    }
     per_cpu_[i].event_stream = f;
     fwrite(&pkt_ctx_, sizeof(pkt_ctx_), 1, f);
   }
 }
 
 void LTTNGClient::CloseStreamFiles() {
-  for (size_t i = 0; i < RTEMS_RECORD_CLIENT_MAXIMUM_CPU_COUNT; ++i) {
+  for (size_t i = 0; i < cpu_count_; ++i) {
     PerCPUContext* pcpu = &per_cpu_[i];
     fseek(pcpu->event_stream, 0, SEEK_SET);
 
@@ -425,10 +441,12 @@ static const char kMetadata[] =
     "};\n";
 
 static void GenerateMetadata() {
-  FILE* file = fopen("metadata", "w");
-  assert(file != NULL);
-  fwrite(kMetadata, sizeof(kMetadata) - 1, 1, file);
-  fclose(file);
+  FILE* f = fopen("metadata", "w");
+  if (f == NULL) {
+    throw ErrnoException("cannot create file 'metadata'");
+  }
+  fwrite(kMetadata, sizeof(kMetadata) - 1, 1, f);
+  fclose(f);
 }
 
 static LTTNGClient client;
@@ -489,7 +507,6 @@ int main(int argc, char** argv) {
 
   try {
     GenerateMetadata();
-    client.OpenStreamFiles();
 
     if (file != nullptr) {
       client.Open(file);
@@ -500,7 +517,6 @@ int main(int argc, char** argv) {
     signal(SIGINT, SignalHandler);
     client.Run();
     client.Destroy();
-    client.CloseStreamFiles();
   } catch (std::exception& e) {
     std::cerr << e.what() << std::endl;
   }
-- 
2.16.4



More information about the devel mailing list