blob: 0e66924267fbe917fe092f948d0d8322d3943a4c [file] [log] [blame]
Keith Davis02356de2019-08-26 18:28:17 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#pragma once
7
8#include "ProfilingStateMachine.hpp"
9#include "ProfilingConnectionFactory.hpp"
FinnWilliamsArmce2d9d12019-09-18 10:28:16 +010010#include "CounterDirectory.hpp"
Matteo Martincighe0e6efc2019-10-04 17:17:42 +010011#include "ICounterValues.hpp"
Matteo Martincigh54fb9572019-10-02 12:50:57 +010012#include "CommandHandler.hpp"
13#include "BufferManager.hpp"
14#include "SendCounterPacket.hpp"
15#include "ConnectionAcknowledgedCommandHandler.hpp"
Matteo Martincigh8efc5002019-10-10 14:30:29 +010016#include "RequestCounterDirectoryCommandHandler.hpp"
Keith Davis02356de2019-08-26 18:28:17 +010017
18namespace armnn
19{
20
21namespace profiling
22{
23
Matteo Martincigh54fb9572019-10-02 12:50:57 +010024class ProfilingService : public IReadWriteCounterValues
Keith Davis02356de2019-08-26 18:28:17 +010025{
26public:
Matteo Martincigha84edee2019-10-02 12:50:57 +010027 using ExternalProfilingOptions = Runtime::CreationOptions::ExternalProfilingOptions;
Matteo Martincigh54fb9572019-10-02 12:50:57 +010028 using IProfilingConnectionFactoryPtr = std::unique_ptr<IProfilingConnectionFactory>;
Matteo Martincigha84edee2019-10-02 12:50:57 +010029 using IProfilingConnectionPtr = std::unique_ptr<IProfilingConnection>;
30 using CounterIndices = std::vector<std::atomic<uint32_t>*>;
31 using CounterValues = std::list<std::atomic<uint32_t>>;
Keith Davis02356de2019-08-26 18:28:17 +010032
Matteo Martincigha84edee2019-10-02 12:50:57 +010033 // Getter for the singleton instance
34 static ProfilingService& Instance()
35 {
36 static ProfilingService instance;
37 return instance;
38 }
39
40 // Resets the profiling options, optionally clears the profiling service entirely
41 void ResetExternalProfilingOptions(const ExternalProfilingOptions& options, bool resetProfilingService = false);
42
Matteo Martincigh54fb9572019-10-02 12:50:57 +010043 // Updates the profiling service, making it transition to a new state if necessary
44 void Update();
Keith Davis02356de2019-08-26 18:28:17 +010045
Matteo Martincigha84edee2019-10-02 12:50:57 +010046 // Getters for the profiling service state
FinnWilliamsArmce2d9d12019-09-18 10:28:16 +010047 const ICounterDirectory& GetCounterDirectory() const;
Keith Davis02356de2019-08-26 18:28:17 +010048 ProfilingState GetCurrentState() const;
Matteo Martincigha84edee2019-10-02 12:50:57 +010049 uint16_t GetCounterCount() const override;
50 uint32_t GetCounterValue(uint16_t counterUid) const override;
Keith Davis02356de2019-08-26 18:28:17 +010051
Matteo Martincigha84edee2019-10-02 12:50:57 +010052 // Setters for the profiling service state
53 void SetCounterValue(uint16_t counterUid, uint32_t value) override;
54 uint32_t AddCounterValue(uint16_t counterUid, uint32_t value) override;
55 uint32_t SubtractCounterValue(uint16_t counterUid, uint32_t value) override;
56 uint32_t IncrementCounterValue(uint16_t counterUid) override;
57 uint32_t DecrementCounterValue(uint16_t counterUid) override;
FinnWilliamsArmf6e534a2019-09-16 15:45:42 +010058
Keith Davis02356de2019-08-26 18:28:17 +010059private:
Matteo Martincigh54fb9572019-10-02 12:50:57 +010060 // Copy/move constructors/destructors and copy/move assignment operators are deleted
Matteo Martincigha84edee2019-10-02 12:50:57 +010061 ProfilingService(const ProfilingService&) = delete;
62 ProfilingService(ProfilingService&&) = delete;
63 ProfilingService& operator=(const ProfilingService&) = delete;
64 ProfilingService& operator=(ProfilingService&&) = delete;
Keith Davis02356de2019-08-26 18:28:17 +010065
Matteo Martincigh54fb9572019-10-02 12:50:57 +010066 // Initialization/reset functions
Matteo Martincigha84edee2019-10-02 12:50:57 +010067 void Initialize();
68 void InitializeCounterValue(uint16_t counterUid);
Matteo Martincigh54fb9572019-10-02 12:50:57 +010069 void Reset();
Matteo Martincigha84edee2019-10-02 12:50:57 +010070
Matteo Martincigh54fb9572019-10-02 12:50:57 +010071 // Profiling service components
Matteo Martincigha84edee2019-10-02 12:50:57 +010072 ExternalProfilingOptions m_Options;
FinnWilliamsArmce2d9d12019-09-18 10:28:16 +010073 CounterDirectory m_CounterDirectory;
Matteo Martincigh54fb9572019-10-02 12:50:57 +010074 IProfilingConnectionFactoryPtr m_ProfilingConnectionFactory;
Matteo Martincigha84edee2019-10-02 12:50:57 +010075 IProfilingConnectionPtr m_ProfilingConnection;
76 ProfilingStateMachine m_StateMachine;
77 CounterIndices m_CounterIndex;
78 CounterValues m_CounterValues;
Matteo Martincigh54fb9572019-10-02 12:50:57 +010079 CommandHandlerRegistry m_CommandHandlerRegistry;
80 PacketVersionResolver m_PacketVersionResolver;
81 CommandHandler m_CommandHandler;
82 BufferManager m_BufferManager;
83 SendCounterPacket m_SendCounterPacket;
84 ConnectionAcknowledgedCommandHandler m_ConnectionAcknowledgedCommandHandler;
Matteo Martincigh8efc5002019-10-10 14:30:29 +010085 RequestCounterDirectoryCommandHandler m_RequestCounterDirectoryCommandHandler;
Matteo Martincigh54fb9572019-10-02 12:50:57 +010086
87protected:
88 // Default constructor/destructor kept protected for testing
89 ProfilingService()
90 : m_Options()
91 , m_CounterDirectory()
92 , m_ProfilingConnectionFactory(new ProfilingConnectionFactory())
93 , m_ProfilingConnection()
94 , m_StateMachine()
95 , m_CounterIndex()
96 , m_CounterValues()
97 , m_CommandHandlerRegistry()
98 , m_PacketVersionResolver()
99 , m_CommandHandler(1000,
100 false,
101 m_CommandHandlerRegistry,
102 m_PacketVersionResolver)
103 , m_BufferManager()
104 , m_SendCounterPacket(m_StateMachine, m_BufferManager)
105 , m_ConnectionAcknowledgedCommandHandler(1,
106 m_PacketVersionResolver.ResolvePacketVersion(1).GetEncodedValue(),
107 m_StateMachine)
Matteo Martincigh8efc5002019-10-10 14:30:29 +0100108 , m_RequestCounterDirectoryCommandHandler(3,
109 m_PacketVersionResolver.ResolvePacketVersion(3).GetEncodedValue(),
110 m_CounterDirectory,
111 m_SendCounterPacket,
112 m_StateMachine)
Matteo Martincigh54fb9572019-10-02 12:50:57 +0100113 {
114 // Register the "Connection Acknowledged" command handler
115 m_CommandHandlerRegistry.RegisterFunctor(&m_ConnectionAcknowledgedCommandHandler);
Matteo Martincigh8efc5002019-10-10 14:30:29 +0100116
117 // Register the "Request Counter Directory" command handler
118 m_CommandHandlerRegistry.RegisterFunctor(&m_RequestCounterDirectoryCommandHandler);
Matteo Martincigh54fb9572019-10-02 12:50:57 +0100119 }
120 ~ProfilingService() = default;
121
Matteo Martincighd0613b52019-10-09 16:47:04 +0100122 // Protected methods for testing
Matteo Martincigh54fb9572019-10-02 12:50:57 +0100123 void SwapProfilingConnectionFactory(ProfilingService& instance,
124 IProfilingConnectionFactory* other,
125 IProfilingConnectionFactory*& backup)
126 {
127 BOOST_ASSERT(instance.m_ProfilingConnectionFactory);
128 BOOST_ASSERT(other);
129
130 backup = instance.m_ProfilingConnectionFactory.release();
131 instance.m_ProfilingConnectionFactory.reset(other);
132 }
Matteo Martincighd0613b52019-10-09 16:47:04 +0100133 IProfilingConnection* GetProfilingConnection(ProfilingService& instance)
134 {
135 return instance.m_ProfilingConnection.get();
136 }
Matteo Martincigh8efc5002019-10-10 14:30:29 +0100137 void TransitionToState(ProfilingService& instance, ProfilingState newState)
138 {
139 instance.m_StateMachine.TransitionToState(newState);
140 }
Keith Davis02356de2019-08-26 18:28:17 +0100141};
142
143} // namespace profiling
144
Matteo Martincigha84edee2019-10-02 12:50:57 +0100145} // namespace armnn