aboutsummaryrefslogtreecommitdiff
path: root/profiling/server/src/timelineDecoder/TimelineDecoder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'profiling/server/src/timelineDecoder/TimelineDecoder.cpp')
-rw-r--r--profiling/server/src/timelineDecoder/TimelineDecoder.cpp326
1 files changed, 326 insertions, 0 deletions
diff --git a/profiling/server/src/timelineDecoder/TimelineDecoder.cpp b/profiling/server/src/timelineDecoder/TimelineDecoder.cpp
new file mode 100644
index 0000000000..df967de1f5
--- /dev/null
+++ b/profiling/server/src/timelineDecoder/TimelineDecoder.cpp
@@ -0,0 +1,326 @@
+//
+// Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#include <common/include/CommonProfilingUtils.hpp>
+#include <server/include/timelineDecoder/TimelineDecoder.hpp>
+
+#include <iostream>
+#include <sstream>
+
+namespace arm
+{
+namespace pipe
+{
+
+TimelineDecoder::TimelineStatus TimelineDecoder::CreateEntity(const Entity &entity)
+{
+ if (m_OnNewEntityCallback == nullptr)
+ {
+ return TimelineStatus::TimelineStatus_Fail;
+ }
+ m_OnNewEntityCallback(m_Model, entity);
+
+ return TimelineStatus::TimelineStatus_Success;
+}
+
+TimelineDecoder::TimelineStatus TimelineDecoder::CreateEventClass(const EventClass &eventClass)
+{
+ if (m_OnNewEventClassCallback == nullptr)
+ {
+ return TimelineStatus::TimelineStatus_Fail;
+ }
+ m_OnNewEventClassCallback(m_Model, eventClass);
+
+ return TimelineStatus::TimelineStatus_Success;
+}
+
+TimelineDecoder::TimelineStatus TimelineDecoder::CreateEvent(const Event &event)
+{
+ if (m_OnNewEventCallback == nullptr)
+ {
+ return TimelineStatus::TimelineStatus_Fail;
+ }
+ m_OnNewEventCallback(m_Model, event);
+
+ return TimelineStatus::TimelineStatus_Success;
+}
+
+TimelineDecoder::TimelineStatus TimelineDecoder::CreateLabel(const Label &label)
+{
+ if (m_OnNewLabelCallback == nullptr)
+ {
+ return TimelineStatus::TimelineStatus_Fail;
+ }
+ m_OnNewLabelCallback(m_Model, label);
+
+ return TimelineStatus::TimelineStatus_Success;
+}
+
+TimelineDecoder::TimelineStatus TimelineDecoder::CreateRelationship(const Relationship &relationship)
+{
+ if (m_OnNewRelationshipCallback == nullptr)
+ {
+ return TimelineStatus::TimelineStatus_Fail;
+ }
+ m_OnNewRelationshipCallback(m_Model, relationship);
+ return TimelineStatus::TimelineStatus_Success;
+}
+
+const TimelineDecoder::Model &TimelineDecoder::GetModel()
+{
+ return m_Model;
+}
+
+TimelineDecoder::TimelineStatus TimelineDecoder::SetEntityCallback(OnNewEntityCallback cb)
+{
+ if (cb == nullptr)
+ {
+ return TimelineStatus::TimelineStatus_Fail;
+ }
+ m_OnNewEntityCallback = cb;
+ return TimelineStatus::TimelineStatus_Success;
+}
+
+TimelineDecoder::TimelineStatus TimelineDecoder::SetEventClassCallback(OnNewEventClassCallback cb)
+{
+ if (cb == nullptr)
+ {
+ return TimelineStatus::TimelineStatus_Fail;
+ }
+ m_OnNewEventClassCallback = cb;
+ return TimelineStatus::TimelineStatus_Success;
+}
+
+TimelineDecoder::TimelineStatus TimelineDecoder::SetEventCallback(OnNewEventCallback cb)
+{
+ if (cb == nullptr)
+ {
+ return TimelineStatus::TimelineStatus_Fail;
+ }
+ m_OnNewEventCallback = cb;
+ return TimelineStatus::TimelineStatus_Success;
+}
+
+TimelineDecoder::TimelineStatus TimelineDecoder::SetLabelCallback(OnNewLabelCallback cb)
+{
+ if (cb == nullptr)
+ {
+ return TimelineStatus::TimelineStatus_Fail;
+ }
+ m_OnNewLabelCallback = cb;
+ return TimelineStatus::TimelineStatus_Success;
+}
+
+TimelineDecoder::TimelineStatus TimelineDecoder::SetRelationshipCallback(OnNewRelationshipCallback cb)
+{
+ if (cb == nullptr)
+ {
+ return TimelineStatus::TimelineStatus_Fail;
+ }
+ m_OnNewRelationshipCallback = cb;
+ return TimelineStatus::TimelineStatus_Success;
+}
+
+void TimelineDecoder::SetDefaultCallbacks()
+{
+ SetEntityCallback([](Model& model, const ITimelineDecoder::Entity entity)
+ {
+ model.m_Entities.emplace_back(entity);
+ });
+
+ SetEventClassCallback([](Model& model, const ITimelineDecoder::EventClass eventClass)
+ {
+ model.m_EventClasses.emplace_back(eventClass);
+ });
+
+ SetEventCallback([](Model& model, const ITimelineDecoder::Event event)
+ {
+ model.m_Events.emplace_back(event);
+ });
+
+ SetLabelCallback([](Model& model, const ITimelineDecoder::Label label)
+ {
+ model.m_Labels.emplace_back(label);
+ });
+
+ SetRelationshipCallback([](Model& model, const ITimelineDecoder::Relationship relationship)
+ {
+ model.m_Relationships.emplace_back(relationship);
+ });
+}
+
+void TimelineDecoder::print()
+{
+ if (m_Model.m_Labels.empty() && m_Model.m_Entities.empty() && m_Model.m_EventClasses.empty() &&
+ m_Model.m_Events.empty() && m_Model.m_Relationships.empty())
+ {
+ std::cout << "No timeline packets received" << std::endl;
+ return;
+ }
+
+ printLabels();
+ printEntities();
+ printEventClasses();
+ printEvents();
+ printRelationships();
+}
+
+void TimelineDecoder::printLabels()
+{
+ std::string header;
+
+ header.append(arm::pipe::CentreAlignFormatting("guid", 12));
+ header.append(" | ");
+ header.append(arm::pipe::CentreAlignFormatting("value", 30));
+ header.append("\n");
+
+ std::cout << "\n" << "\n";
+ std::cout << arm::pipe::CentreAlignFormatting("LABELS", static_cast<int>(header.size()));
+ std::cout << "\n";
+ std::cout << std::string(header.size(), '=') << "\n";
+ std::cout << header;
+
+ for (uint32_t i = 0; i < m_Model.m_Labels.size(); ++i)
+ {
+ std::string body;
+
+ body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_Model.m_Labels[i].m_Guid), 12));
+ body.append(" | ");
+ body.append(arm::pipe::CentreAlignFormatting(m_Model.m_Labels[i].m_Name, 30));
+ body.append("\n");
+
+ std::cout << std::string(body.size(), '-') << "\n";
+ std::cout << body;
+ }
+}
+
+void TimelineDecoder::printEntities()
+{
+ std::string header;
+ header.append(arm::pipe::CentreAlignFormatting("guid", 12));
+ header.append("\n");
+
+ std::cout << "\n" << "\n";
+ std::cout << arm::pipe::CentreAlignFormatting("ENTITIES", static_cast<int>(header.size()));
+ std::cout << "\n";
+ std::cout << std::string(header.size(), '=') << "\n";
+ std::cout << header;
+
+ for (uint32_t i = 0; i < m_Model.m_Entities.size(); ++i)
+ {
+ std::string body;
+
+ body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_Model.m_Entities[i].m_Guid), 12));
+ body.append("\n");
+
+ std::cout << std::string(body.size(), '-') << "\n";
+ std::cout << body;
+ }
+}
+
+void TimelineDecoder::printEventClasses()
+{
+ std::string header;
+ header.append(arm::pipe::CentreAlignFormatting("guid", 12));
+ header.append("\n");
+
+ std::cout << "\n" << "\n";
+ std::cout << arm::pipe::CentreAlignFormatting("EVENT CLASSES", static_cast<int>(header.size()));
+ std::cout << "\n";
+ std::cout << std::string(header.size(), '=') << "\n";
+ std::cout << header;
+
+ for (uint32_t i = 0; i < m_Model.m_EventClasses.size(); ++i)
+ {
+ std::string body;
+
+ body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_Model.m_EventClasses[i].m_Guid), 12));
+ body.append("\n");
+
+ std::cout << std::string(body.size(), '-') << "\n";
+ std::cout << body;
+ }
+}
+
+void TimelineDecoder::printEvents()
+{
+ std::string header;
+
+ header.append(arm::pipe::CentreAlignFormatting("timestamp", 12));
+ header.append(" | ");
+ header.append(arm::pipe::CentreAlignFormatting("threadId", 12));
+ header.append(" | ");
+ header.append(arm::pipe::CentreAlignFormatting("eventGuid", 12));
+ header.append("\n");
+
+ std::cout << "\n" << "\n";
+ std::cout << arm::pipe::CentreAlignFormatting("EVENTS", static_cast<int>(header.size()));
+ std::cout << "\n";
+ std::cout << std::string(header.size(), '=') << "\n";
+ std::cout << header;
+
+ for (uint32_t i = 0; i < m_Model.m_Events.size(); ++i)
+ {
+ std::string body;
+
+ body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_Model.m_Events[i].m_TimeStamp), 12));
+ body.append(" | ");
+
+ std::stringstream ss;
+ ss << m_Model.m_Events[i].m_ThreadId;
+ std::string threadId = ss.str();;
+
+ body.append(arm::pipe::CentreAlignFormatting(threadId, 12));
+ body.append(" | ");
+ body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_Model.m_Events[i].m_Guid), 12));
+ body.append("\n");
+
+ std::cout << std::string(body.size(), '-') << "\n";
+ std::cout << body;
+ }
+}
+
+void TimelineDecoder::printRelationships()
+{
+ std::string header;
+ header.append(arm::pipe::CentreAlignFormatting("relationshipType", 20));
+ header.append(" | ");
+ header.append(arm::pipe::CentreAlignFormatting("relationshipGuid", 20));
+ header.append(" | ");
+ header.append(arm::pipe::CentreAlignFormatting("headGuid", 12));
+ header.append(" | ");
+ header.append(arm::pipe::CentreAlignFormatting("tailGuid", 12));
+ header.append("\n");
+
+ std::cout << "\n" << "\n";
+ std::cout << arm::pipe::CentreAlignFormatting("RELATIONSHIPS", static_cast<int>(header.size()));
+ std::cout << "\n";
+ std::cout << std::string(header.size(), '=') << "\n";
+ std::cout << header;
+
+ for (uint32_t i = 0; i < m_Model.m_Relationships.size(); ++i)
+ {
+ std::string body;
+
+ body.append(
+ arm::pipe::CentreAlignFormatting(std::to_string(static_cast<unsigned int>
+ (m_Model.m_Relationships[i].m_RelationshipType)),
+ 20));
+ body.append(" | ");
+ body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_Model.m_Relationships[i].m_Guid), 20));
+ body.append(" | ");
+ body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_Model.m_Relationships[i].m_HeadGuid), 12));
+ body.append(" | ");
+ body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_Model.m_Relationships[i].m_TailGuid), 12));
+ body.append(" | ");
+ body.append("\n");
+
+ std::cout << std::string(body.size(), '-') << "\n";
+ std::cout << body;
+ }
+}
+
+} // namespace pipe
+} // namespace arm \ No newline at end of file