[rtems-tools commit] record: Only create necessary stream files

Sebastian Huber sebh at rtems.org
Wed Sep 4 11:48:03 UTC 2019


Module:    rtems-tools
Branch:    master
Commit:    ce308fad89b859fbd9463bfc07cebd14d2ae4ffc
Changeset: http://git.rtems.org/rtems-tools/commit/?id=ce308fad89b859fbd9463bfc07cebd14d2ae4ffc

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Wed Sep  4 07:09:46 2019 +0200

record: Only create necessary stream files

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;
   }




More information about the vc mailing list