blob: 6eaaff6e548a4f2bc497dbde2004169869873456 [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 }
Matthew Bentham6ae43c42022-01-10 13:34:12 +000023 ApplyToModel([&](Model& m){
24 m_OnNewEntityCallback(m, entity);
25 });
Keith Davis97da5e22020-03-05 16:25:28 +000026 return TimelineStatus::TimelineStatus_Success;
Finn Williamse63a0262019-10-22 10:30:49 +010027}
28
Keith Davis97da5e22020-03-05 16:25:28 +000029TimelineDecoder::TimelineStatus TimelineDecoder::CreateEventClass(const EventClass &eventClass)
Finn Williamse63a0262019-10-22 10:30:49 +010030{
Finn Williams510f6182020-02-21 11:14:08 +000031 if (m_OnNewEventClassCallback == nullptr)
Finn Williamse63a0262019-10-22 10:30:49 +010032 {
Keith Davis97da5e22020-03-05 16:25:28 +000033 return TimelineStatus::TimelineStatus_Fail;
Finn Williamse63a0262019-10-22 10:30:49 +010034 }
Matthew Bentham6ae43c42022-01-10 13:34:12 +000035 ApplyToModel([&](Model& m){
36 m_OnNewEventClassCallback(m, eventClass);
37 });
Finn Williams510f6182020-02-21 11:14:08 +000038
Keith Davis97da5e22020-03-05 16:25:28 +000039 return TimelineStatus::TimelineStatus_Success;
Finn Williamse63a0262019-10-22 10:30:49 +010040}
41
Keith Davis97da5e22020-03-05 16:25:28 +000042TimelineDecoder::TimelineStatus TimelineDecoder::CreateEvent(const Event &event)
Finn Williamse63a0262019-10-22 10:30:49 +010043{
Finn Williams510f6182020-02-21 11:14:08 +000044 if (m_OnNewEventCallback == nullptr)
Finn Williamse63a0262019-10-22 10:30:49 +010045 {
Keith Davis97da5e22020-03-05 16:25:28 +000046 return TimelineStatus::TimelineStatus_Fail;
Finn Williamse63a0262019-10-22 10:30:49 +010047 }
Matthew Bentham6ae43c42022-01-10 13:34:12 +000048 ApplyToModel([&](Model& m){
49 m_OnNewEventCallback(m, event);
50 });
Finn Williams510f6182020-02-21 11:14:08 +000051
Keith Davis97da5e22020-03-05 16:25:28 +000052 return TimelineStatus::TimelineStatus_Success;
Finn Williamse63a0262019-10-22 10:30:49 +010053}
54
Keith Davis97da5e22020-03-05 16:25:28 +000055TimelineDecoder::TimelineStatus TimelineDecoder::CreateLabel(const Label &label)
Finn Williamse63a0262019-10-22 10:30:49 +010056{
Finn Williams510f6182020-02-21 11:14:08 +000057 if (m_OnNewLabelCallback == nullptr)
Finn Williamse63a0262019-10-22 10:30:49 +010058 {
Keith Davis97da5e22020-03-05 16:25:28 +000059 return TimelineStatus::TimelineStatus_Fail;
Finn Williamse63a0262019-10-22 10:30:49 +010060 }
Matthew Bentham6ae43c42022-01-10 13:34:12 +000061 ApplyToModel([&](Model& m){
62 m_OnNewLabelCallback(m, label);
63 });
Finn Williams510f6182020-02-21 11:14:08 +000064
Keith Davis97da5e22020-03-05 16:25:28 +000065 return TimelineStatus::TimelineStatus_Success;
Finn Williamse63a0262019-10-22 10:30:49 +010066}
67
Keith Davis97da5e22020-03-05 16:25:28 +000068TimelineDecoder::TimelineStatus TimelineDecoder::CreateRelationship(const Relationship &relationship)
Finn Williamse63a0262019-10-22 10:30:49 +010069{
Finn Williams510f6182020-02-21 11:14:08 +000070 if (m_OnNewRelationshipCallback == nullptr)
Finn Williamse63a0262019-10-22 10:30:49 +010071 {
Keith Davis97da5e22020-03-05 16:25:28 +000072 return TimelineStatus::TimelineStatus_Fail;
Finn Williamse63a0262019-10-22 10:30:49 +010073 }
Matthew Bentham6ae43c42022-01-10 13:34:12 +000074 ApplyToModel([&](Model& m){
75 m_OnNewRelationshipCallback(m, relationship);
76 });
Keith Davis97da5e22020-03-05 16:25:28 +000077 return TimelineStatus::TimelineStatus_Success;
Finn Williamse63a0262019-10-22 10:30:49 +010078}
79
Keith Davis97da5e22020-03-05 16:25:28 +000080TimelineDecoder::TimelineStatus TimelineDecoder::SetEntityCallback(OnNewEntityCallback cb)
Finn Williams510f6182020-02-21 11:14:08 +000081{
82 if (cb == nullptr)
Finn Williamse63a0262019-10-22 10:30:49 +010083 {
Keith Davis97da5e22020-03-05 16:25:28 +000084 return TimelineStatus::TimelineStatus_Fail;
Finn Williamse63a0262019-10-22 10:30:49 +010085 }
Finn Williams510f6182020-02-21 11:14:08 +000086 m_OnNewEntityCallback = cb;
Keith Davis97da5e22020-03-05 16:25:28 +000087 return TimelineStatus::TimelineStatus_Success;
Finn Williamse63a0262019-10-22 10:30:49 +010088}
89
Keith Davis97da5e22020-03-05 16:25:28 +000090TimelineDecoder::TimelineStatus TimelineDecoder::SetEventClassCallback(OnNewEventClassCallback cb)
Finn Williamse63a0262019-10-22 10:30:49 +010091{
Finn Williams510f6182020-02-21 11:14:08 +000092 if (cb == nullptr)
Finn Williamse63a0262019-10-22 10:30:49 +010093 {
Keith Davis97da5e22020-03-05 16:25:28 +000094 return TimelineStatus::TimelineStatus_Fail;
Finn Williamse63a0262019-10-22 10:30:49 +010095 }
Finn Williams510f6182020-02-21 11:14:08 +000096 m_OnNewEventClassCallback = cb;
Keith Davis97da5e22020-03-05 16:25:28 +000097 return TimelineStatus::TimelineStatus_Success;
Finn Williamse63a0262019-10-22 10:30:49 +010098}
99
Keith Davis97da5e22020-03-05 16:25:28 +0000100TimelineDecoder::TimelineStatus TimelineDecoder::SetEventCallback(OnNewEventCallback cb)
Finn Williamse63a0262019-10-22 10:30:49 +0100101{
Finn Williams510f6182020-02-21 11:14:08 +0000102 if (cb == nullptr)
Finn Williamse63a0262019-10-22 10:30:49 +0100103 {
Keith Davis97da5e22020-03-05 16:25:28 +0000104 return TimelineStatus::TimelineStatus_Fail;
Finn Williamse63a0262019-10-22 10:30:49 +0100105 }
Finn Williams510f6182020-02-21 11:14:08 +0000106 m_OnNewEventCallback = cb;
Keith Davis97da5e22020-03-05 16:25:28 +0000107 return TimelineStatus::TimelineStatus_Success;
Finn Williamse63a0262019-10-22 10:30:49 +0100108}
109
Keith Davis97da5e22020-03-05 16:25:28 +0000110TimelineDecoder::TimelineStatus TimelineDecoder::SetLabelCallback(OnNewLabelCallback cb)
Finn Williamse63a0262019-10-22 10:30:49 +0100111{
Finn Williams510f6182020-02-21 11:14:08 +0000112 if (cb == nullptr)
Finn Williamse63a0262019-10-22 10:30:49 +0100113 {
Keith Davis97da5e22020-03-05 16:25:28 +0000114 return TimelineStatus::TimelineStatus_Fail;
Finn Williamse63a0262019-10-22 10:30:49 +0100115 }
Finn Williams510f6182020-02-21 11:14:08 +0000116 m_OnNewLabelCallback = cb;
Keith Davis97da5e22020-03-05 16:25:28 +0000117 return TimelineStatus::TimelineStatus_Success;
Finn Williamse63a0262019-10-22 10:30:49 +0100118}
119
Keith Davis97da5e22020-03-05 16:25:28 +0000120TimelineDecoder::TimelineStatus TimelineDecoder::SetRelationshipCallback(OnNewRelationshipCallback cb)
Finn Williamse63a0262019-10-22 10:30:49 +0100121{
Finn Williams510f6182020-02-21 11:14:08 +0000122 if (cb == nullptr)
Finn Williamse63a0262019-10-22 10:30:49 +0100123 {
Keith Davis97da5e22020-03-05 16:25:28 +0000124 return TimelineStatus::TimelineStatus_Fail;
Finn Williamse63a0262019-10-22 10:30:49 +0100125 }
Finn Williams510f6182020-02-21 11:14:08 +0000126 m_OnNewRelationshipCallback = cb;
Keith Davis97da5e22020-03-05 16:25:28 +0000127 return TimelineStatus::TimelineStatus_Success;
Finn Williamse63a0262019-10-22 10:30:49 +0100128}
129
Finn Williamse6a2ccd2020-02-27 16:21:41 +0000130void TimelineDecoder::SetDefaultCallbacks()
131{
132 SetEntityCallback([](Model& model, const ITimelineDecoder::Entity entity)
133 {
134 model.m_Entities.emplace_back(entity);
135 });
136
137 SetEventClassCallback([](Model& model, const ITimelineDecoder::EventClass eventClass)
138 {
139 model.m_EventClasses.emplace_back(eventClass);
140 });
141
142 SetEventCallback([](Model& model, const ITimelineDecoder::Event event)
143 {
144 model.m_Events.emplace_back(event);
145 });
146
147 SetLabelCallback([](Model& model, const ITimelineDecoder::Label label)
148 {
149 model.m_Labels.emplace_back(label);
150 });
151
152 SetRelationshipCallback([](Model& model, const ITimelineDecoder::Relationship relationship)
153 {
154 model.m_Relationships.emplace_back(relationship);
155 });
156}
157
Finn Williams510f6182020-02-21 11:14:08 +0000158void TimelineDecoder::print()
Finn Williamse63a0262019-10-22 10:30:49 +0100159{
Finn Williamsd7fcafa2020-04-23 17:55:18 +0100160 if (m_Model.m_Labels.empty() && m_Model.m_Entities.empty() && m_Model.m_EventClasses.empty() &&
161 m_Model.m_Events.empty() && m_Model.m_Relationships.empty())
162 {
163 std::cout << "No timeline packets received" << std::endl;
164 return;
165 }
166
Finn Williams510f6182020-02-21 11:14:08 +0000167 printLabels();
168 printEntities();
169 printEventClasses();
170 printEvents();
171 printRelationships();
Finn Williamse63a0262019-10-22 10:30:49 +0100172}
173
Finn Williams510f6182020-02-21 11:14:08 +0000174void TimelineDecoder::printLabels()
Finn Williamse63a0262019-10-22 10:30:49 +0100175{
Finn Williams510f6182020-02-21 11:14:08 +0000176 std::string header;
177
Jim Flynnbbfe6032020-07-20 16:57:44 +0100178 header.append(arm::pipe::CentreAlignFormatting("guid", 12));
Finn Williams510f6182020-02-21 11:14:08 +0000179 header.append(" | ");
Jim Flynnbbfe6032020-07-20 16:57:44 +0100180 header.append(arm::pipe::CentreAlignFormatting("value", 30));
Finn Williams510f6182020-02-21 11:14:08 +0000181 header.append("\n");
182
183 std::cout << "\n" << "\n";
Jim Flynnbbfe6032020-07-20 16:57:44 +0100184 std::cout << arm::pipe::CentreAlignFormatting("LABELS", static_cast<int>(header.size()));
Finn Williams510f6182020-02-21 11:14:08 +0000185 std::cout << "\n";
186 std::cout << std::string(header.size(), '=') << "\n";
187 std::cout << header;
188
189 for (uint32_t i = 0; i < m_Model.m_Labels.size(); ++i)
Finn Williamse63a0262019-10-22 10:30:49 +0100190 {
Finn Williams510f6182020-02-21 11:14:08 +0000191 std::string body;
192
Jim Flynnbbfe6032020-07-20 16:57:44 +0100193 body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_Model.m_Labels[i].m_Guid), 12));
Finn Williams510f6182020-02-21 11:14:08 +0000194 body.append(" | ");
Jim Flynnbbfe6032020-07-20 16:57:44 +0100195 body.append(arm::pipe::CentreAlignFormatting(m_Model.m_Labels[i].m_Name, 30));
Finn Williams510f6182020-02-21 11:14:08 +0000196 body.append("\n");
197
198 std::cout << std::string(body.size(), '-') << "\n";
199 std::cout << body;
Finn Williamse63a0262019-10-22 10:30:49 +0100200 }
Finn Williams510f6182020-02-21 11:14:08 +0000201}
Finn Williamse63a0262019-10-22 10:30:49 +0100202
Finn Williams510f6182020-02-21 11:14:08 +0000203void TimelineDecoder::printEntities()
204{
205 std::string header;
Jim Flynnbbfe6032020-07-20 16:57:44 +0100206 header.append(arm::pipe::CentreAlignFormatting("guid", 12));
Finn Williams510f6182020-02-21 11:14:08 +0000207 header.append("\n");
Finn Williamse63a0262019-10-22 10:30:49 +0100208
Finn Williams510f6182020-02-21 11:14:08 +0000209 std::cout << "\n" << "\n";
Jim Flynnbbfe6032020-07-20 16:57:44 +0100210 std::cout << arm::pipe::CentreAlignFormatting("ENTITIES", static_cast<int>(header.size()));
Finn Williams510f6182020-02-21 11:14:08 +0000211 std::cout << "\n";
212 std::cout << std::string(header.size(), '=') << "\n";
213 std::cout << header;
214
215 for (uint32_t i = 0; i < m_Model.m_Entities.size(); ++i)
Finn Williamse63a0262019-10-22 10:30:49 +0100216 {
Finn Williams510f6182020-02-21 11:14:08 +0000217 std::string body;
Finn Williamse63a0262019-10-22 10:30:49 +0100218
Jim Flynnbbfe6032020-07-20 16:57:44 +0100219 body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_Model.m_Entities[i].m_Guid), 12));
Finn Williams510f6182020-02-21 11:14:08 +0000220 body.append("\n");
221
222 std::cout << std::string(body.size(), '-') << "\n";
223 std::cout << body;
224 }
225}
226
227void TimelineDecoder::printEventClasses()
228{
229 std::string header;
Jim Flynnbbfe6032020-07-20 16:57:44 +0100230 header.append(arm::pipe::CentreAlignFormatting("guid", 12));
Finn Williams510f6182020-02-21 11:14:08 +0000231 header.append("\n");
232
233 std::cout << "\n" << "\n";
Jim Flynnbbfe6032020-07-20 16:57:44 +0100234 std::cout << arm::pipe::CentreAlignFormatting("EVENT CLASSES", static_cast<int>(header.size()));
Finn Williams510f6182020-02-21 11:14:08 +0000235 std::cout << "\n";
236 std::cout << std::string(header.size(), '=') << "\n";
237 std::cout << header;
238
239 for (uint32_t i = 0; i < m_Model.m_EventClasses.size(); ++i)
Finn Williamse63a0262019-10-22 10:30:49 +0100240 {
Finn Williams510f6182020-02-21 11:14:08 +0000241 std::string body;
Finn Williamse63a0262019-10-22 10:30:49 +0100242
Jim Flynnbbfe6032020-07-20 16:57:44 +0100243 body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_Model.m_EventClasses[i].m_Guid), 12));
Finn Williams510f6182020-02-21 11:14:08 +0000244 body.append("\n");
245
246 std::cout << std::string(body.size(), '-') << "\n";
247 std::cout << body;
248 }
249}
250
251void TimelineDecoder::printEvents()
252{
253 std::string header;
254
Jim Flynnbbfe6032020-07-20 16:57:44 +0100255 header.append(arm::pipe::CentreAlignFormatting("timestamp", 12));
Finn Williams510f6182020-02-21 11:14:08 +0000256 header.append(" | ");
Jim Flynnbbfe6032020-07-20 16:57:44 +0100257 header.append(arm::pipe::CentreAlignFormatting("threadId", 12));
Finn Williams510f6182020-02-21 11:14:08 +0000258 header.append(" | ");
Jim Flynnbbfe6032020-07-20 16:57:44 +0100259 header.append(arm::pipe::CentreAlignFormatting("eventGuid", 12));
Finn Williams510f6182020-02-21 11:14:08 +0000260 header.append("\n");
261
262 std::cout << "\n" << "\n";
Jim Flynnbbfe6032020-07-20 16:57:44 +0100263 std::cout << arm::pipe::CentreAlignFormatting("EVENTS", static_cast<int>(header.size()));
Finn Williams510f6182020-02-21 11:14:08 +0000264 std::cout << "\n";
265 std::cout << std::string(header.size(), '=') << "\n";
266 std::cout << header;
267
268 for (uint32_t i = 0; i < m_Model.m_Events.size(); ++i)
Finn Williamse63a0262019-10-22 10:30:49 +0100269 {
Finn Williams510f6182020-02-21 11:14:08 +0000270 std::string body;
Finn Williamse63a0262019-10-22 10:30:49 +0100271
Jim Flynnbbfe6032020-07-20 16:57:44 +0100272 body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_Model.m_Events[i].m_TimeStamp), 12));
Finn Williams510f6182020-02-21 11:14:08 +0000273 body.append(" | ");
274
275 std::stringstream ss;
276 ss << m_Model.m_Events[i].m_ThreadId;
277 std::string threadId = ss.str();;
278
Jim Flynnbbfe6032020-07-20 16:57:44 +0100279 body.append(arm::pipe::CentreAlignFormatting(threadId, 12));
Finn Williams510f6182020-02-21 11:14:08 +0000280 body.append(" | ");
Jim Flynnbbfe6032020-07-20 16:57:44 +0100281 body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_Model.m_Events[i].m_Guid), 12));
Finn Williams510f6182020-02-21 11:14:08 +0000282 body.append("\n");
283
284 std::cout << std::string(body.size(), '-') << "\n";
285 std::cout << body;
286 }
287}
288
289void TimelineDecoder::printRelationships()
290{
291 std::string header;
Jim Flynnbbfe6032020-07-20 16:57:44 +0100292 header.append(arm::pipe::CentreAlignFormatting("relationshipType", 20));
Finn Williams510f6182020-02-21 11:14:08 +0000293 header.append(" | ");
Jim Flynnbbfe6032020-07-20 16:57:44 +0100294 header.append(arm::pipe::CentreAlignFormatting("relationshipGuid", 20));
Finn Williams510f6182020-02-21 11:14:08 +0000295 header.append(" | ");
Jim Flynnbbfe6032020-07-20 16:57:44 +0100296 header.append(arm::pipe::CentreAlignFormatting("headGuid", 12));
Finn Williams510f6182020-02-21 11:14:08 +0000297 header.append(" | ");
Jim Flynnbbfe6032020-07-20 16:57:44 +0100298 header.append(arm::pipe::CentreAlignFormatting("tailGuid", 12));
Finn Williams510f6182020-02-21 11:14:08 +0000299 header.append("\n");
300
301 std::cout << "\n" << "\n";
Jim Flynnbbfe6032020-07-20 16:57:44 +0100302 std::cout << arm::pipe::CentreAlignFormatting("RELATIONSHIPS", static_cast<int>(header.size()));
Finn Williams510f6182020-02-21 11:14:08 +0000303 std::cout << "\n";
304 std::cout << std::string(header.size(), '=') << "\n";
305 std::cout << header;
306
307 for (uint32_t i = 0; i < m_Model.m_Relationships.size(); ++i)
Finn Williamse63a0262019-10-22 10:30:49 +0100308 {
Finn Williams510f6182020-02-21 11:14:08 +0000309 std::string body;
310
311 body.append(
Jim Flynnbbfe6032020-07-20 16:57:44 +0100312 arm::pipe::CentreAlignFormatting(std::to_string(static_cast<unsigned int>
Finn Williams510f6182020-02-21 11:14:08 +0000313 (m_Model.m_Relationships[i].m_RelationshipType)),
314 20));
315 body.append(" | ");
Jim Flynnbbfe6032020-07-20 16:57:44 +0100316 body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_Model.m_Relationships[i].m_Guid), 20));
Finn Williams510f6182020-02-21 11:14:08 +0000317 body.append(" | ");
Jim Flynnbbfe6032020-07-20 16:57:44 +0100318 body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_Model.m_Relationships[i].m_HeadGuid), 12));
Finn Williams510f6182020-02-21 11:14:08 +0000319 body.append(" | ");
Jim Flynnbbfe6032020-07-20 16:57:44 +0100320 body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_Model.m_Relationships[i].m_TailGuid), 12));
Finn Williams510f6182020-02-21 11:14:08 +0000321 body.append(" | ");
322 body.append("\n");
323
324 std::cout << std::string(body.size(), '-') << "\n";
325 std::cout << body;
Finn Williamse63a0262019-10-22 10:30:49 +0100326 }
Finn Williams510f6182020-02-21 11:14:08 +0000327}
Jim Flynnbbfe6032020-07-20 16:57:44 +0100328
329} // namespace pipe
Matthew Bentham6ae43c42022-01-10 13:34:12 +0000330} // namespace arm