From ce308fad89b859fbd9463bfc07cebd14d2ae4ffc Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Wed, 4 Sep 2019 07:09:46 +0200 Subject: 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(-) (limited to 'trace') 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(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; } -- cgit v1.2.3