blob: 58fac969ab888120818cca02c08b428f1324fba1 [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//
5
6#include "ProfilingStateMachine.hpp"
7
8#include <armnn/Exceptions.hpp>
9
Matteo Martincigha84edee2019-10-02 12:50:57 +010010#include <sstream>
11
Nikhil Raj3ecc5102019-09-03 15:55:33 +010012namespace armnn
13{
14
15namespace profiling
16{
17
Matteo Martincigha84edee2019-10-02 12:50:57 +010018namespace
19{
20
21void ThrowStateTransitionException(ProfilingState expectedState, ProfilingState newState)
22{
23 std::stringstream ss;
24 ss << "Cannot transition from state [" << GetProfilingStateName(expectedState) << "] "
25 << "to state [" << GetProfilingStateName(newState) << "]";
26 throw armnn::RuntimeException(ss.str());
27}
28
29} // Anonymous namespace
30
Nikhil Raj3ecc5102019-09-03 15:55:33 +010031ProfilingState ProfilingStateMachine::GetCurrentState() const
32{
Matteo Martincigha84edee2019-10-02 12:50:57 +010033 return m_State.load();
Nikhil Raj3ecc5102019-09-03 15:55:33 +010034}
35
36void ProfilingStateMachine::TransitionToState(ProfilingState newState)
37{
Matteo Martincigh54fb9572019-10-02 12:50:57 +010038 ProfilingState currentState = m_State.load(std::memory_order::memory_order_relaxed);
Nikhil Raj3ecc5102019-09-03 15:55:33 +010039
Matteo Martincigha84edee2019-10-02 12:50:57 +010040 switch (newState)
41 {
42 case ProfilingState::Uninitialised:
43 do
44 {
Matteo Martincigh54fb9572019-10-02 12:50:57 +010045 if (!IsOneOfStates(currentState, ProfilingState::Uninitialised))
Matteo Martincigha84edee2019-10-02 12:50:57 +010046 {
Matteo Martincigh54fb9572019-10-02 12:50:57 +010047 ThrowStateTransitionException(currentState, newState);
Matteo Martincigha84edee2019-10-02 12:50:57 +010048 }
49 }
Matteo Martincigh54fb9572019-10-02 12:50:57 +010050 while (!m_State.compare_exchange_strong(currentState, newState, std::memory_order::memory_order_relaxed));
Matteo Martincigha84edee2019-10-02 12:50:57 +010051 break;
52 case ProfilingState::NotConnected:
53 do
54 {
Matteo Martincigh54fb9572019-10-02 12:50:57 +010055 if (!IsOneOfStates(currentState, ProfilingState::Uninitialised, ProfilingState::NotConnected,
Jim Flynn53e46992019-10-14 12:31:10 +010056 ProfilingState::Active, ProfilingState::WaitingForAck))
Matteo Martincigha84edee2019-10-02 12:50:57 +010057 {
Matteo Martincigh54fb9572019-10-02 12:50:57 +010058 ThrowStateTransitionException(currentState, newState);
Matteo Martincigha84edee2019-10-02 12:50:57 +010059 }
60 }
Matteo Martincigh54fb9572019-10-02 12:50:57 +010061 while (!m_State.compare_exchange_strong(currentState, newState, std::memory_order::memory_order_relaxed));
Matteo Martincigha84edee2019-10-02 12:50:57 +010062 break;
63 case ProfilingState::WaitingForAck:
64 do
65 {
Matteo Martincigh54fb9572019-10-02 12:50:57 +010066 if (!IsOneOfStates(currentState, ProfilingState::NotConnected, ProfilingState::WaitingForAck))
Matteo Martincigha84edee2019-10-02 12:50:57 +010067 {
Matteo Martincigh54fb9572019-10-02 12:50:57 +010068 ThrowStateTransitionException(currentState, newState);
Matteo Martincigha84edee2019-10-02 12:50:57 +010069 }
70 }
Matteo Martincigh54fb9572019-10-02 12:50:57 +010071 while (!m_State.compare_exchange_strong(currentState, newState, std::memory_order::memory_order_relaxed));
Matteo Martincigha84edee2019-10-02 12:50:57 +010072 break;
73 case ProfilingState::Active:
74 do
75 {
Matteo Martincigh54fb9572019-10-02 12:50:57 +010076 if (!IsOneOfStates(currentState, ProfilingState::WaitingForAck, ProfilingState::Active))
Matteo Martincigha84edee2019-10-02 12:50:57 +010077 {
Matteo Martincigh54fb9572019-10-02 12:50:57 +010078 ThrowStateTransitionException(currentState, newState);
Matteo Martincigha84edee2019-10-02 12:50:57 +010079 }
80 }
Matteo Martincigh54fb9572019-10-02 12:50:57 +010081 while (!m_State.compare_exchange_strong(currentState, newState, std::memory_order::memory_order_relaxed));
Matteo Martincigha84edee2019-10-02 12:50:57 +010082 break;
83 default:
84 break;
85 }
Nikhil Raj3ecc5102019-09-03 15:55:33 +010086}
87
Matteo Martincigha84edee2019-10-02 12:50:57 +010088void ProfilingStateMachine::Reset()
89{
90 m_State.store(ProfilingState::Uninitialised);
91}
Nikhil Raj3ecc5102019-09-03 15:55:33 +010092
Matteo Martincigha84edee2019-10-02 12:50:57 +010093} // namespace profiling
94
95} // namespace armnn