From bbfe603e5ae42317a2b67d713d00882bea341c88 Mon Sep 17 00:00:00 2001 From: Jim Flynn Date: Mon, 20 Jul 2020 16:57:44 +0100 Subject: IVGCVSW-5166 Pull out the common and server side code into standalone libraries Change-Id: I180f84c493a9b2be4b93b25d312ebdd9e71b1735 Signed-off-by: Jim Flynn --- .../server/src/timelineDecoder/TimelineDecoder.cpp | 326 +++++++++++++++++++++ 1 file changed, 326 insertions(+) create mode 100644 profiling/server/src/timelineDecoder/TimelineDecoder.cpp (limited to 'profiling/server/src/timelineDecoder/TimelineDecoder.cpp') 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 +#include + +#include +#include + +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(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(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(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(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(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 + (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 -- cgit v1.2.1