| // | |
| // 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 |