blob: df967de1f54c101ad324647e3351266556dab89b [file] [log] [blame]
Finn Williamse63a0262019-10-22 10:30:49 +01001//
Jim Flynnbbfe6032020-07-20 16:57:44 +01002// Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
Finn Williamse63a0262019-10-22 10:30:49 +01003// SPDX-License-Identifier: MIT
4//
5
Jim Flynnbbfe6032020-07-20 16:57:44 +01006#include <common/include/CommonProfilingUtils.hpp>
7#include <server/include/timelineDecoder/TimelineDecoder.hpp>
Finn Williamse6a2ccd2020-02-27 16:21:41 +00008
Jim Flynnbbfe6032020-07-20 16:57:44 +01009#include <iostream>
10#include <sstream>
11
12namespace arm
Finn Williamse63a0262019-10-22 10:30:49 +010013{
Jim Flynnbbfe6032020-07-20 16:57:44 +010014namespace pipe
Finn Williams8a2b4682020-02-26 10:25:26 +000015{
Finn Williamse6a2ccd2020-02-27 16:21:41 +000016
Keith Davis97da5e22020-03-05 16:25:28 +000017TimelineDecoder::TimelineStatus TimelineDecoder::CreateEntity(const Entity &entity)
Finn Williams510f6182020-02-21 11:14:08 +000018{
19 if (m_OnNewEntityCallback == nullptr)
Finn Williamse63a0262019-10-22 10:30:49 +010020 {
Keith Davis97da5e22020-03-05 16:25:28 +000021 return TimelineStatus::TimelineStatus_Fail;
Finn Williamse63a0262019-10-22 10:30:49 +010022 }
Finn Williams510f6182020-02-21 11:14:08 +000023 m_OnNewEntityCallback(m_Model, entity);
24
Keith Davis97da5e22020-03-05 16:25:28 +000025 return TimelineStatus::TimelineStatus_Success;
Finn Williamse63a0262019-10-22 10:30:49 +010026}
27
Keith Davis97da5e22020-03-05 16:25:28 +000028TimelineDecoder::TimelineStatus TimelineDecoder::CreateEventClass(const EventClass &eventClass)
Finn Williamse63a0262019-10-22 10:30:49 +010029{
Finn Williams510f6182020-02-21 11:14:08 +000030 if (m_OnNewEventClassCallback == nullptr)
Finn Williamse63a0262019-10-22 10:30:49 +010031 {
Keith Davis97da5e22020-03-05 16:25:28 +000032 return TimelineStatus::TimelineStatus_Fail;
Finn Williamse63a0262019-10-22 10:30:49 +010033 }
Finn Williams510f6182020-02-21 11:14:08 +000034 m_OnNewEventClassCallback(m_Model, eventClass);
35
Keith Davis97da5e22020-03-05 16:25:28 +000036 return TimelineStatus::TimelineStatus_Success;
Finn Williamse63a0262019-10-22 10:30:49 +010037}
38
Keith Davis97da5e22020-03-05 16:25:28 +000039TimelineDecoder::TimelineStatus TimelineDecoder::CreateEvent(const Event &event)
Finn Williamse63a0262019-10-22 10:30:49 +010040{
Finn Williams510f6182020-02-21 11:14:08 +000041 if (m_OnNewEventCallback == nullptr)
Finn Williamse63a0262019-10-22 10:30:49 +010042 {
Keith Davis97da5e22020-03-05 16:25:28 +000043 return TimelineStatus::TimelineStatus_Fail;
Finn Williamse63a0262019-10-22 10:30:49 +010044 }
Finn Williams510f6182020-02-21 11:14:08 +000045 m_OnNewEventCallback(m_Model, event);
46
Keith Davis97da5e22020-03-05 16:25:28 +000047 return TimelineStatus::TimelineStatus_Success;
Finn Williamse63a0262019-10-22 10:30:49 +010048}
49
Keith Davis97da5e22020-03-05 16:25:28 +000050TimelineDecoder::TimelineStatus TimelineDecoder::CreateLabel(const Label &label)
Finn Williamse63a0262019-10-22 10:30:49 +010051{
Finn Williams510f6182020-02-21 11:14:08 +000052 if (m_OnNewLabelCallback == nullptr)
Finn Williamse63a0262019-10-22 10:30:49 +010053 {
Keith Davis97da5e22020-03-05 16:25:28 +000054 return TimelineStatus::TimelineStatus_Fail;
Finn Williamse63a0262019-10-22 10:30:49 +010055 }
Finn Williams510f6182020-02-21 11:14:08 +000056 m_OnNewLabelCallback(m_Model, label);
57
Keith Davis97da5e22020-03-05 16:25:28 +000058 return TimelineStatus::TimelineStatus_Success;
Finn Williamse63a0262019-10-22 10:30:49 +010059}
60
Keith Davis97da5e22020-03-05 16:25:28 +000061TimelineDecoder::TimelineStatus TimelineDecoder::CreateRelationship(const Relationship &relationship)
Finn Williamse63a0262019-10-22 10:30:49 +010062{
Finn Williams510f6182020-02-21 11:14:08 +000063 if (m_OnNewRelationshipCallback == nullptr)
Finn Williamse63a0262019-10-22 10:30:49 +010064 {
Keith Davis97da5e22020-03-05 16:25:28 +000065 return TimelineStatus::TimelineStatus_Fail;
Finn Williamse63a0262019-10-22 10:30:49 +010066 }
Finn Williams510f6182020-02-21 11:14:08 +000067 m_OnNewRelationshipCallback(m_Model, relationship);
Keith Davis97da5e22020-03-05 16:25:28 +000068 return TimelineStatus::TimelineStatus_Success;
Finn Williamse63a0262019-10-22 10:30:49 +010069}
70
Finn Williams510f6182020-02-21 11:14:08 +000071const TimelineDecoder::Model &TimelineDecoder::GetModel()
Finn Williamse63a0262019-10-22 10:30:49 +010072{
Finn Williams510f6182020-02-21 11:14:08 +000073 return m_Model;
74}
75
Keith Davis97da5e22020-03-05 16:25:28 +000076TimelineDecoder::TimelineStatus TimelineDecoder::SetEntityCallback(OnNewEntityCallback cb)
Finn Williams510f6182020-02-21 11:14:08 +000077{
78 if (cb == nullptr)
Finn Williamse63a0262019-10-22 10:30:49 +010079 {
Keith Davis97da5e22020-03-05 16:25:28 +000080 return TimelineStatus::TimelineStatus_Fail;
Finn Williamse63a0262019-10-22 10:30:49 +010081 }
Finn Williams510f6182020-02-21 11:14:08 +000082 m_OnNewEntityCallback = cb;
Keith Davis97da5e22020-03-05 16:25:28 +000083 return TimelineStatus::TimelineStatus_Success;
Finn Williamse63a0262019-10-22 10:30:49 +010084}
85
Keith Davis97da5e22020-03-05 16:25:28 +000086TimelineDecoder::TimelineStatus TimelineDecoder::SetEventClassCallback(OnNewEventClassCallback cb)
Finn Williamse63a0262019-10-22 10:30:49 +010087{
Finn Williams510f6182020-02-21 11:14:08 +000088 if (cb == nullptr)
Finn Williamse63a0262019-10-22 10:30:49 +010089 {
Keith Davis97da5e22020-03-05 16:25:28 +000090 return TimelineStatus::TimelineStatus_Fail;
Finn Williamse63a0262019-10-22 10:30:49 +010091 }
Finn Williams510f6182020-02-21 11:14:08 +000092 m_OnNewEventClassCallback = cb;
Keith Davis97da5e22020-03-05 16:25:28 +000093 return TimelineStatus::TimelineStatus_Success;
Finn Williamse63a0262019-10-22 10:30:49 +010094}
95
Keith Davis97da5e22020-03-05 16:25:28 +000096TimelineDecoder::TimelineStatus TimelineDecoder::SetEventCallback(OnNewEventCallback cb)
Finn Williamse63a0262019-10-22 10:30:49 +010097{
Finn Williams510f6182020-02-21 11:14:08 +000098 if (cb == nullptr)
Finn Williamse63a0262019-10-22 10:30:49 +010099 {
Keith Davis97da5e22020-03-05 16:25:28 +0000100 return TimelineStatus::TimelineStatus_Fail;
Finn Williamse63a0262019-10-22 10:30:49 +0100101 }
Finn Williams510f6182020-02-21 11:14:08 +0000102 m_OnNewEventCallback = cb;
Keith Davis97da5e22020-03-05 16:25:28 +0000103 return TimelineStatus::TimelineStatus_Success;
Finn Williamse63a0262019-10-22 10:30:49 +0100104}
105
Keith Davis97da5e22020-03-05 16:25:28 +0000106TimelineDecoder::TimelineStatus TimelineDecoder::SetLabelCallback(OnNewLabelCallback cb)
Finn Williamse63a0262019-10-22 10:30:49 +0100107{
Finn Williams510f6182020-02-21 11:14:08 +0000108 if (cb == nullptr)
Finn Williamse63a0262019-10-22 10:30:49 +0100109 {
Keith Davis97da5e22020-03-05 16:25:28 +0000110 return TimelineStatus::TimelineStatus_Fail;
Finn Williamse63a0262019-10-22 10:30:49 +0100111 }
Finn Williams510f6182020-02-21 11:14:08 +0000112 m_OnNewLabelCallback = cb;
Keith Davis97da5e22020-03-05 16:25:28 +0000113 return TimelineStatus::TimelineStatus_Success;
Finn Williamse63a0262019-10-22 10:30:49 +0100114}
115
Keith Davis97da5e22020-03-05 16:25:28 +0000116TimelineDecoder::TimelineStatus TimelineDecoder::SetRelationshipCallback(OnNewRelationshipCallback cb)
Finn Williamse63a0262019-10-22 10:30:49 +0100117{
Finn Williams510f6182020-02-21 11:14:08 +0000118 if (cb == nullptr)
Finn Williamse63a0262019-10-22 10:30:49 +0100119 {
Keith Davis97da5e22020-03-05 16:25:28 +0000120 return TimelineStatus::TimelineStatus_Fail;
Finn Williamse63a0262019-10-22 10:30:49 +0100121 }
Finn Williams510f6182020-02-21 11:14:08 +0000122 m_OnNewRelationshipCallback = cb;
Keith Davis97da5e22020-03-05 16:25:28 +0000123 return TimelineStatus::TimelineStatus_Success;
Finn Williamse63a0262019-10-22 10:30:49 +0100124}
125
Finn Williamse6a2ccd2020-02-27 16:21:41 +0000126void TimelineDecoder::SetDefaultCallbacks()
127{
128 SetEntityCallback([](Model& model, const ITimelineDecoder::Entity entity)
129 {
130 model.m_Entities.emplace_back(entity);
131 });
132
133 SetEventClassCallback([](Model& model, const ITimelineDecoder::EventClass eventClass)
134 {
135 model.m_EventClasses.emplace_back(eventClass);
136 });
137
138 SetEventCallback([](Model& model, const ITimelineDecoder::Event event)
139 {
140 model.m_Events.emplace_back(event);
141 });
142
143 SetLabelCallback([](Model& model, const ITimelineDecoder::Label label)
144 {
145 model.m_Labels.emplace_back(label);
146 });
147
148 SetRelationshipCallback([](Model& model, const ITimelineDecoder::Relationship relationship)
149 {
150 model.m_Relationships.emplace_back(relationship);
151 });
152}
153
Finn Williams510f6182020-02-21 11:14:08 +0000154void TimelineDecoder::print()
Finn Williamse63a0262019-10-22 10:30:49 +0100155{
Finn Williamsd7fcafa2020-04-23 17:55:18 +0100156 if (m_Model.m_Labels.empty() && m_Model.m_Entities.empty() && m_Model.m_EventClasses.empty() &&
157 m_Model.m_Events.empty() && m_Model.m_Relationships.empty())
158 {
159 std::cout << "No timeline packets received" << std::endl;
160 return;
161 }
162
Finn Williams510f6182020-02-21 11:14:08 +0000163 printLabels();
164 printEntities();
165 printEventClasses();
166 printEvents();
167 printRelationships();
Finn Williamse63a0262019-10-22 10:30:49 +0100168}
169
Finn Williams510f6182020-02-21 11:14:08 +0000170void TimelineDecoder::printLabels()
Finn Williamse63a0262019-10-22 10:30:49 +0100171{
Finn Williams510f6182020-02-21 11:14:08 +0000172 std::string header;
173
Jim Flynnbbfe6032020-07-20 16:57:44 +0100174 header.append(arm::pipe::CentreAlignFormatting("guid", 12));
Finn Williams510f6182020-02-21 11:14:08 +0000175 header.append(" | ");
Jim Flynnbbfe6032020-07-20 16:57:44 +0100176 header.append(arm::pipe::CentreAlignFormatting("value", 30));
Finn Williams510f6182020-02-21 11:14:08 +0000177 header.append("\n");
178
179 std::cout << "\n" << "\n";
Jim Flynnbbfe6032020-07-20 16:57:44 +0100180 std::cout << arm::pipe::CentreAlignFormatting("LABELS", static_cast<int>(header.size()));
Finn Williams510f6182020-02-21 11:14:08 +0000181 std::cout << "\n";
182 std::cout << std::string(header.size(), '=') << "\n";
183 std::cout << header;
184
185 for (uint32_t i = 0; i < m_Model.m_Labels.size(); ++i)
Finn Williamse63a0262019-10-22 10:30:49 +0100186 {
Finn Williams510f6182020-02-21 11:14:08 +0000187 std::string body;
188
Jim Flynnbbfe6032020-07-20 16:57:44 +0100189 body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_Model.m_Labels[i].m_Guid), 12));
Finn Williams510f6182020-02-21 11:14:08 +0000190 body.append(" | ");
Jim Flynnbbfe6032020-07-20 16:57:44 +0100191 body.append(arm::pipe::CentreAlignFormatting(m_Model.m_Labels[i].m_Name, 30));
Finn Williams510f6182020-02-21 11:14:08 +0000192 body.append("\n");
193
194 std::cout << std::string(body.size(), '-') << "\n";
195 std::cout << body;
Finn Williamse63a0262019-10-22 10:30:49 +0100196 }
Finn Williams510f6182020-02-21 11:14:08 +0000197}
Finn Williamse63a0262019-10-22 10:30:49 +0100198
Finn Williams510f6182020-02-21 11:14:08 +0000199void TimelineDecoder::printEntities()
200{
201 std::string header;
Jim Flynnbbfe6032020-07-20 16:57:44 +0100202 header.append(arm::pipe::CentreAlignFormatting("guid", 12));
Finn Williams510f6182020-02-21 11:14:08 +0000203 header.append("\n");
Finn Williamse63a0262019-10-22 10:30:49 +0100204
Finn Williams510f6182020-02-21 11:14:08 +0000205 std::cout << "\n" << "\n";
Jim Flynnbbfe6032020-07-20 16:57:44 +0100206 std::cout << arm::pipe::CentreAlignFormatting("ENTITIES", static_cast<int>(header.size()));
Finn Williams510f6182020-02-21 11:14:08 +0000207 std::cout << "\n";
208 std::cout << std::string(header.size(), '=') << "\n";
209 std::cout << header;
210
211 for (uint32_t i = 0; i < m_Model.m_Entities.size(); ++i)
Finn Williamse63a0262019-10-22 10:30:49 +0100212 {
Finn Williams510f6182020-02-21 11:14:08 +0000213 std::string body;
Finn Williamse63a0262019-10-22 10:30:49 +0100214
Jim Flynnbbfe6032020-07-20 16:57:44 +0100215 body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_Model.m_Entities[i].m_Guid), 12));
Finn Williams510f6182020-02-21 11:14:08 +0000216 body.append("\n");
217
218 std::cout << std::string(body.size(), '-') << "\n";
219 std::cout << body;
220 }
221}
222
223void TimelineDecoder::printEventClasses()
224{
225 std::string header;
Jim Flynnbbfe6032020-07-20 16:57:44 +0100226 header.append(arm::pipe::CentreAlignFormatting("guid", 12));
Finn Williams510f6182020-02-21 11:14:08 +0000227 header.append("\n");
228
229 std::cout << "\n" << "\n";
Jim Flynnbbfe6032020-07-20 16:57:44 +0100230 std::cout << arm::pipe::CentreAlignFormatting("EVENT CLASSES", static_cast<int>(header.size()));
Finn Williams510f6182020-02-21 11:14:08 +0000231 std::cout << "\n";
232 std::cout << std::string(header.size(), '=') << "\n";
233 std::cout << header;
234
235 for (uint32_t i = 0; i < m_Model.m_EventClasses.size(); ++i)
Finn Williamse63a0262019-10-22 10:30:49 +0100236 {
Finn Williams510f6182020-02-21 11:14:08 +0000237 std::string body;
Finn Williamse63a0262019-10-22 10:30:49 +0100238
Jim Flynnbbfe6032020-07-20 16:57:44 +0100239 body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_Model.m_EventClasses[i].m_Guid), 12));
Finn Williams510f6182020-02-21 11:14:08 +0000240 body.append("\n");
241
242 std::cout << std::string(body.size(), '-') << "\n";
243 std::cout << body;
244 }
245}
246
247void TimelineDecoder::printEvents()
248{
249 std::string header;
250
Jim Flynnbbfe6032020-07-20 16:57:44 +0100251 header.append(arm::pipe::CentreAlignFormatting("timestamp", 12));
Finn Williams510f6182020-02-21 11:14:08 +0000252 header.append(" | ");
Jim Flynnbbfe6032020-07-20 16:57:44 +0100253 header.append(arm::pipe::CentreAlignFormatting("threadId", 12));
Finn Williams510f6182020-02-21 11:14:08 +0000254 header.append(" | ");
Jim Flynnbbfe6032020-07-20 16:57:44 +0100255 header.append(arm::pipe::CentreAlignFormatting("eventGuid", 12));
Finn Williams510f6182020-02-21 11:14:08 +0000256 header.append("\n");
257
258 std::cout << "\n" << "\n";
Jim Flynnbbfe6032020-07-20 16:57:44 +0100259 std::cout << arm::pipe::CentreAlignFormatting("EVENTS", static_cast<int>(header.size()));
Finn Williams510f6182020-02-21 11:14:08 +0000260 std::cout << "\n";
261 std::cout << std::string(header.size(), '=') << "\n";
262 std::cout << header;
263
264 for (uint32_t i = 0; i < m_Model.m_Events.size(); ++i)
Finn Williamse63a0262019-10-22 10:30:49 +0100265 {
Finn Williams510f6182020-02-21 11:14:08 +0000266 std::string body;
Finn Williamse63a0262019-10-22 10:30:49 +0100267
Jim Flynnbbfe6032020-07-20 16:57:44 +0100268 body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_Model.m_Events[i].m_TimeStamp), 12));
Finn Williams510f6182020-02-21 11:14:08 +0000269 body.append(" | ");
270
271 std::stringstream ss;
272 ss << m_Model.m_Events[i].m_ThreadId;
273 std::string threadId = ss.str();;
274
Jim Flynnbbfe6032020-07-20 16:57:44 +0100275 body.append(arm::pipe::CentreAlignFormatting(threadId, 12));
Finn Williams510f6182020-02-21 11:14:08 +0000276 body.append(" | ");
Jim Flynnbbfe6032020-07-20 16:57:44 +0100277 body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_Model.m_Events[i].m_Guid), 12));
Finn Williams510f6182020-02-21 11:14:08 +0000278 body.append("\n");
279
280 std::cout << std::string(body.size(), '-') << "\n";
281 std::cout << body;
282 }
283}
284
285void TimelineDecoder::printRelationships()
286{
287 std::string header;
Jim Flynnbbfe6032020-07-20 16:57:44 +0100288 header.append(arm::pipe::CentreAlignFormatting("relationshipType", 20));
Finn Williams510f6182020-02-21 11:14:08 +0000289 header.append(" | ");
Jim Flynnbbfe6032020-07-20 16:57:44 +0100290 header.append(arm::pipe::CentreAlignFormatting("relationshipGuid", 20));
Finn Williams510f6182020-02-21 11:14:08 +0000291 header.append(" | ");
Jim Flynnbbfe6032020-07-20 16:57:44 +0100292 header.append(arm::pipe::CentreAlignFormatting("headGuid", 12));
Finn Williams510f6182020-02-21 11:14:08 +0000293 header.append(" | ");
Jim Flynnbbfe6032020-07-20 16:57:44 +0100294 header.append(arm::pipe::CentreAlignFormatting("tailGuid", 12));
Finn Williams510f6182020-02-21 11:14:08 +0000295 header.append("\n");
296
297 std::cout << "\n" << "\n";
Jim Flynnbbfe6032020-07-20 16:57:44 +0100298 std::cout << arm::pipe::CentreAlignFormatting("RELATIONSHIPS", static_cast<int>(header.size()));
Finn Williams510f6182020-02-21 11:14:08 +0000299 std::cout << "\n";
300 std::cout << std::string(header.size(), '=') << "\n";
301 std::cout << header;
302
303 for (uint32_t i = 0; i < m_Model.m_Relationships.size(); ++i)
Finn Williamse63a0262019-10-22 10:30:49 +0100304 {
Finn Williams510f6182020-02-21 11:14:08 +0000305 std::string body;
306
307 body.append(
Jim Flynnbbfe6032020-07-20 16:57:44 +0100308 arm::pipe::CentreAlignFormatting(std::to_string(static_cast<unsigned int>
Finn Williams510f6182020-02-21 11:14:08 +0000309 (m_Model.m_Relationships[i].m_RelationshipType)),
310 20));
311 body.append(" | ");
Jim Flynnbbfe6032020-07-20 16:57:44 +0100312 body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_Model.m_Relationships[i].m_Guid), 20));
Finn Williams510f6182020-02-21 11:14:08 +0000313 body.append(" | ");
Jim Flynnbbfe6032020-07-20 16:57:44 +0100314 body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_Model.m_Relationships[i].m_HeadGuid), 12));
Finn Williams510f6182020-02-21 11:14:08 +0000315 body.append(" | ");
Jim Flynnbbfe6032020-07-20 16:57:44 +0100316 body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_Model.m_Relationships[i].m_TailGuid), 12));
Finn Williams510f6182020-02-21 11:14:08 +0000317 body.append(" | ");
318 body.append("\n");
319
320 std::cout << std::string(body.size(), '-') << "\n";
321 std::cout << body;
Finn Williamse63a0262019-10-22 10:30:49 +0100322 }
Finn Williams510f6182020-02-21 11:14:08 +0000323}
Jim Flynnbbfe6032020-07-20 16:57:44 +0100324
325} // namespace pipe
326} // namespace arm