blob: b507f1a50b79f9bad26000f5cae36fdd44af48e1 [file] [log] [blame]
Nikhil Raj3ecc5102019-09-03 15:55:33 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
Matteo Martincigha84edee2019-10-02 12:50:57 +01005
Nikhil Raj3ecc5102019-09-03 15:55:33 +01006#pragma once
7
Jim Flynn27761832022-03-20 21:52:17 +00008#include <client/include/ProfilingState.hpp>
Nikhil Raj3ecc5102019-09-03 15:55:33 +01009
Jim Flynn9265a882022-03-10 23:35:26 +000010#include <common/include/IgnoreUnused.hpp>
Derek Lamberti1dd75b32019-12-10 21:23:23 +000011
Jim Flynn27761832022-03-20 21:52:17 +000012#include <atomic>
13
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000014namespace arm
Nikhil Raj3ecc5102019-09-03 15:55:33 +010015{
16
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000017namespace pipe
Nikhil Raj3ecc5102019-09-03 15:55:33 +010018{
19
Nikhil Raj3ecc5102019-09-03 15:55:33 +010020class ProfilingStateMachine
21{
22public:
Matteo Martincigha84edee2019-10-02 12:50:57 +010023 ProfilingStateMachine() : m_State(ProfilingState::Uninitialised) {}
24 ProfilingStateMachine(ProfilingState state) : m_State(state) {}
Nikhil Raj3ecc5102019-09-03 15:55:33 +010025
26 ProfilingState GetCurrentState() const;
27 void TransitionToState(ProfilingState newState);
Matteo Martincigha84edee2019-10-02 12:50:57 +010028 void Reset();
Nikhil Raj3ecc5102019-09-03 15:55:33 +010029
30 bool IsOneOfStates(ProfilingState state1)
31 {
Jim Flynn9265a882022-03-10 23:35:26 +000032 arm::pipe::IgnoreUnused(state1);
Nikhil Raj3ecc5102019-09-03 15:55:33 +010033 return false;
34 }
35
36 template<typename T, typename... Args >
37 bool IsOneOfStates(T state1, T state2, Args... args)
38 {
39 if (state1 == state2)
40 {
41 return true;
42 }
43 else
44 {
45 return IsOneOfStates(state1, args...);
46 }
47 }
48
49private:
50 std::atomic<ProfilingState> m_State;
51};
52
53constexpr char const* GetProfilingStateName(ProfilingState state)
54{
Matteo Martincigha84edee2019-10-02 12:50:57 +010055 switch (state)
Nikhil Raj3ecc5102019-09-03 15:55:33 +010056 {
Matteo Martincigha84edee2019-10-02 12:50:57 +010057 case ProfilingState::Uninitialised: return "Uninitialised";
58 case ProfilingState::NotConnected: return "NotConnected";
59 case ProfilingState::WaitingForAck: return "WaitingForAck";
60 case ProfilingState::Active: return "Active";
61 default: return "Unknown";
Nikhil Raj3ecc5102019-09-03 15:55:33 +010062 }
63}
64
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000065} // namespace pipe
Nikhil Raj3ecc5102019-09-03 15:55:33 +010066
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000067} // namespace arm