1*89c4ff92SAndroid Build Coastguard Worker // 2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2020 Arm Ltd. All rights reserved. 3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT 4*89c4ff92SAndroid Build Coastguard Worker // 5*89c4ff92SAndroid Build Coastguard Worker 6*89c4ff92SAndroid Build Coastguard Worker #pragma once 7*89c4ff92SAndroid Build Coastguard Worker 8*89c4ff92SAndroid Build Coastguard Worker 9*89c4ff92SAndroid Build Coastguard Worker #include <common/include/IgnoreUnused.hpp> 10*89c4ff92SAndroid Build Coastguard Worker #include <common/include/TargetEndianess.hpp> 11*89c4ff92SAndroid Build Coastguard Worker 12*89c4ff92SAndroid Build Coastguard Worker #include <cstdint> 13*89c4ff92SAndroid Build Coastguard Worker #include <memory> 14*89c4ff92SAndroid Build Coastguard Worker #include <vector> 15*89c4ff92SAndroid Build Coastguard Worker 16*89c4ff92SAndroid Build Coastguard Worker // forward declare to prevent a circular dependency 17*89c4ff92SAndroid Build Coastguard Worker namespace arm 18*89c4ff92SAndroid Build Coastguard Worker { 19*89c4ff92SAndroid Build Coastguard Worker namespace pipe 20*89c4ff92SAndroid Build Coastguard Worker { 21*89c4ff92SAndroid Build Coastguard Worker 22*89c4ff92SAndroid Build Coastguard Worker class Packet; 23*89c4ff92SAndroid Build Coastguard Worker 24*89c4ff92SAndroid Build Coastguard Worker // the handlers need to be able to do two 25*89c4ff92SAndroid Build Coastguard Worker // things to service the FileOnlyProfilingConnection 26*89c4ff92SAndroid Build Coastguard Worker // and any other implementation of IProfilingConnection 27*89c4ff92SAndroid Build Coastguard Worker // set the endianness and write a packet back i.e. 28*89c4ff92SAndroid Build Coastguard Worker // return a packet and close the connection 29*89c4ff92SAndroid Build Coastguard Worker class IInternalProfilingConnection 30*89c4ff92SAndroid Build Coastguard Worker { 31*89c4ff92SAndroid Build Coastguard Worker public: ~IInternalProfilingConnection()32*89c4ff92SAndroid Build Coastguard Worker virtual ~IInternalProfilingConnection() {}; 33*89c4ff92SAndroid Build Coastguard Worker 34*89c4ff92SAndroid Build Coastguard Worker virtual void SetEndianess(const TargetEndianness& endianness) = 0; 35*89c4ff92SAndroid Build Coastguard Worker 36*89c4ff92SAndroid Build Coastguard Worker virtual void ReturnPacket(Packet& packet) = 0; 37*89c4ff92SAndroid Build Coastguard Worker 38*89c4ff92SAndroid Build Coastguard Worker virtual void Close() = 0; 39*89c4ff92SAndroid Build Coastguard Worker }; 40*89c4ff92SAndroid Build Coastguard Worker 41*89c4ff92SAndroid Build Coastguard Worker class ILocalPacketHandler 42*89c4ff92SAndroid Build Coastguard Worker { 43*89c4ff92SAndroid Build Coastguard Worker public: ~ILocalPacketHandler()44*89c4ff92SAndroid Build Coastguard Worker virtual ~ILocalPacketHandler() {}; 45*89c4ff92SAndroid Build Coastguard Worker 46*89c4ff92SAndroid Build Coastguard Worker /// @return lists the headers of the packets that this handler accepts 47*89c4ff92SAndroid Build Coastguard Worker /// only these packets will get sent to this handler. 48*89c4ff92SAndroid Build Coastguard Worker /// If this function returns an empty list then ALL packets 49*89c4ff92SAndroid Build Coastguard Worker /// will be sent to the PacketHandler i.e. a universal handler. 50*89c4ff92SAndroid Build Coastguard Worker virtual std::vector<uint32_t> GetHeadersAccepted() = 0; 51*89c4ff92SAndroid Build Coastguard Worker 52*89c4ff92SAndroid Build Coastguard Worker /// process the packet 53*89c4ff92SAndroid Build Coastguard Worker virtual void HandlePacket(const Packet& packet) = 0; 54*89c4ff92SAndroid Build Coastguard Worker 55*89c4ff92SAndroid Build Coastguard Worker /// Set a profiling connection on the handler. Only need to implement this 56*89c4ff92SAndroid Build Coastguard Worker /// function if the handler will be writing data back to the profiled application. SetConnection(IInternalProfilingConnection * profilingConnection)57*89c4ff92SAndroid Build Coastguard Worker virtual void SetConnection(IInternalProfilingConnection* profilingConnection) 58*89c4ff92SAndroid Build Coastguard Worker { 59*89c4ff92SAndroid Build Coastguard Worker arm::pipe::IgnoreUnused(profilingConnection); 60*89c4ff92SAndroid Build Coastguard Worker } 61*89c4ff92SAndroid Build Coastguard Worker }; 62*89c4ff92SAndroid Build Coastguard Worker 63*89c4ff92SAndroid Build Coastguard Worker using ILocalPacketHandlerPtr = std::unique_ptr<ILocalPacketHandler>; 64*89c4ff92SAndroid Build Coastguard Worker using ILocalPacketHandlerSharedPtr = std::shared_ptr<ILocalPacketHandler>; 65*89c4ff92SAndroid Build Coastguard Worker 66*89c4ff92SAndroid Build Coastguard Worker } // namespace pipe 67*89c4ff92SAndroid Build Coastguard Worker 68*89c4ff92SAndroid Build Coastguard Worker } // namespace arm 69