1*89c4ff92SAndroid Build Coastguard Worker // 2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2020 Arm Ltd and Contributors. All rights reserved. 3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT 4*89c4ff92SAndroid Build Coastguard Worker // 5*89c4ff92SAndroid Build Coastguard Worker #pragma once 6*89c4ff92SAndroid Build Coastguard Worker 7*89c4ff92SAndroid Build Coastguard Worker #include "ITimelineDecoder.hpp" 8*89c4ff92SAndroid Build Coastguard Worker 9*89c4ff92SAndroid Build Coastguard Worker #include <mutex> 10*89c4ff92SAndroid Build Coastguard Worker #include <utility> 11*89c4ff92SAndroid Build Coastguard Worker #include <vector> 12*89c4ff92SAndroid Build Coastguard Worker 13*89c4ff92SAndroid Build Coastguard Worker namespace arm 14*89c4ff92SAndroid Build Coastguard Worker { 15*89c4ff92SAndroid Build Coastguard Worker 16*89c4ff92SAndroid Build Coastguard Worker namespace pipe 17*89c4ff92SAndroid Build Coastguard Worker { 18*89c4ff92SAndroid Build Coastguard Worker 19*89c4ff92SAndroid Build Coastguard Worker class TimelineDecoder : public ITimelineDecoder 20*89c4ff92SAndroid Build Coastguard Worker { 21*89c4ff92SAndroid Build Coastguard Worker 22*89c4ff92SAndroid Build Coastguard Worker public: 23*89c4ff92SAndroid Build Coastguard Worker 24*89c4ff92SAndroid Build Coastguard Worker struct Model 25*89c4ff92SAndroid Build Coastguard Worker { 26*89c4ff92SAndroid Build Coastguard Worker std::vector<Entity> m_Entities; 27*89c4ff92SAndroid Build Coastguard Worker std::vector<EventClass> m_EventClasses; 28*89c4ff92SAndroid Build Coastguard Worker std::vector<Event> m_Events; 29*89c4ff92SAndroid Build Coastguard Worker std::vector<Label> m_Labels; 30*89c4ff92SAndroid Build Coastguard Worker std::vector<Relationship> m_Relationships; 31*89c4ff92SAndroid Build Coastguard Worker }; 32*89c4ff92SAndroid Build Coastguard Worker 33*89c4ff92SAndroid Build Coastguard Worker using OnNewEntityCallback = void (*)(Model &, const Entity); 34*89c4ff92SAndroid Build Coastguard Worker using OnNewEventClassCallback = void (*)(Model &, const EventClass); 35*89c4ff92SAndroid Build Coastguard Worker using OnNewEventCallback = void (*)(Model &, const Event); 36*89c4ff92SAndroid Build Coastguard Worker using OnNewLabelCallback = void (*)(Model &, const Label); 37*89c4ff92SAndroid Build Coastguard Worker using OnNewRelationshipCallback = void (*)(Model &, const Relationship); 38*89c4ff92SAndroid Build Coastguard Worker 39*89c4ff92SAndroid Build Coastguard Worker virtual TimelineStatus CreateEntity(const Entity &) override; 40*89c4ff92SAndroid Build Coastguard Worker virtual TimelineStatus CreateEventClass(const EventClass &) override; 41*89c4ff92SAndroid Build Coastguard Worker virtual TimelineStatus CreateEvent(const Event &) override; 42*89c4ff92SAndroid Build Coastguard Worker virtual TimelineStatus CreateLabel(const Label &) override; 43*89c4ff92SAndroid Build Coastguard Worker virtual TimelineStatus CreateRelationship(const Relationship &) override; 44*89c4ff92SAndroid Build Coastguard Worker 45*89c4ff92SAndroid Build Coastguard Worker template<class F> ApplyToModel(F && f)46*89c4ff92SAndroid Build Coastguard Worker decltype(auto) ApplyToModel(F&& f){ 47*89c4ff92SAndroid Build Coastguard Worker std::lock_guard<std::mutex> lock(m_ModelMutex); 48*89c4ff92SAndroid Build Coastguard Worker return f(m_Model); 49*89c4ff92SAndroid Build Coastguard Worker } 50*89c4ff92SAndroid Build Coastguard Worker 51*89c4ff92SAndroid Build Coastguard Worker TimelineStatus SetEntityCallback(const OnNewEntityCallback); 52*89c4ff92SAndroid Build Coastguard Worker TimelineStatus SetEventClassCallback(const OnNewEventClassCallback); 53*89c4ff92SAndroid Build Coastguard Worker TimelineStatus SetEventCallback(const OnNewEventCallback); 54*89c4ff92SAndroid Build Coastguard Worker TimelineStatus SetLabelCallback(const OnNewLabelCallback); 55*89c4ff92SAndroid Build Coastguard Worker TimelineStatus SetRelationshipCallback(const OnNewRelationshipCallback); 56*89c4ff92SAndroid Build Coastguard Worker 57*89c4ff92SAndroid Build Coastguard Worker void SetDefaultCallbacks(); 58*89c4ff92SAndroid Build Coastguard Worker 59*89c4ff92SAndroid Build Coastguard Worker void print(); 60*89c4ff92SAndroid Build Coastguard Worker 61*89c4ff92SAndroid Build Coastguard Worker private: 62*89c4ff92SAndroid Build Coastguard Worker Model m_Model; 63*89c4ff92SAndroid Build Coastguard Worker std::mutex m_ModelMutex; 64*89c4ff92SAndroid Build Coastguard Worker 65*89c4ff92SAndroid Build Coastguard Worker OnNewEntityCallback m_OnNewEntityCallback; 66*89c4ff92SAndroid Build Coastguard Worker OnNewEventClassCallback m_OnNewEventClassCallback; 67*89c4ff92SAndroid Build Coastguard Worker OnNewEventCallback m_OnNewEventCallback; 68*89c4ff92SAndroid Build Coastguard Worker OnNewLabelCallback m_OnNewLabelCallback; 69*89c4ff92SAndroid Build Coastguard Worker OnNewRelationshipCallback m_OnNewRelationshipCallback; 70*89c4ff92SAndroid Build Coastguard Worker 71*89c4ff92SAndroid Build Coastguard Worker void printLabels(); 72*89c4ff92SAndroid Build Coastguard Worker void printEntities(); 73*89c4ff92SAndroid Build Coastguard Worker void printEventClasses(); 74*89c4ff92SAndroid Build Coastguard Worker void printRelationships(); 75*89c4ff92SAndroid Build Coastguard Worker void printEvents(); 76*89c4ff92SAndroid Build Coastguard Worker }; 77*89c4ff92SAndroid Build Coastguard Worker 78*89c4ff92SAndroid Build Coastguard Worker } // namespace pipe 79*89c4ff92SAndroid Build Coastguard Worker } // namespace arm 80