blob: cc68dcf74d0e3d5368d7fe67210293d5720df61e [file] [log] [blame]
FinnWilliamsArm4833cea2019-09-17 16:53:53 +01001//
2// Copyright © 2019 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
Matteo Martincigh8a837172019-10-04 17:01:07 +01006#include "CommandHandler.hpp"
FinnWilliamsArm4833cea2019-09-17 16:53:53 +01007
Matteo Martincighd0613b52019-10-09 16:47:04 +01008#include <boost/log/trivial.hpp>
9
FinnWilliamsArm4833cea2019-09-17 16:53:53 +010010namespace armnn
11{
12
13namespace profiling
14{
15
Matteo Martincigh8a837172019-10-04 17:01:07 +010016void CommandHandler::Start(IProfilingConnection& profilingConnection)
FinnWilliamsArm4833cea2019-09-17 16:53:53 +010017{
Matteo Martincigh88813932019-10-04 14:40:04 +010018 if (IsRunning())
FinnWilliamsArm4833cea2019-09-17 16:53:53 +010019 {
Matteo Martincigh88813932019-10-04 14:40:04 +010020 return;
FinnWilliamsArm4833cea2019-09-17 16:53:53 +010021 }
Matteo Martincigh88813932019-10-04 14:40:04 +010022
Matteo Martincighc2728f92019-10-07 12:35:21 +010023 m_IsRunning.store(true);
24 m_KeepRunning.store(true);
Matteo Martincigh8a837172019-10-04 17:01:07 +010025 m_CommandThread = std::thread(&CommandHandler::HandleCommands, this, std::ref(profilingConnection));
FinnWilliamsArm4833cea2019-09-17 16:53:53 +010026}
27
Matteo Martincigh8a837172019-10-04 17:01:07 +010028void CommandHandler::Stop()
FinnWilliamsArm4833cea2019-09-17 16:53:53 +010029{
Matteo Martincighc2728f92019-10-07 12:35:21 +010030 m_KeepRunning.store(false);
FinnWilliamsArm4833cea2019-09-17 16:53:53 +010031
Matteo Martincigh88813932019-10-04 14:40:04 +010032 if (m_CommandThread.joinable())
33 {
34 m_CommandThread.join();
35 }
FinnWilliamsArm4833cea2019-09-17 16:53:53 +010036}
37
Matteo Martincigh8a837172019-10-04 17:01:07 +010038void CommandHandler::HandleCommands(IProfilingConnection& profilingConnection)
Matteo Martincigh88813932019-10-04 14:40:04 +010039{
40 do
41 {
42 try
43 {
Matteo Martincighd0613b52019-10-09 16:47:04 +010044 Packet packet = profilingConnection.ReadPacket(m_Timeout.load());
45
46 if (packet.IsEmpty())
47 {
48 // Nothing to do, continue
49 continue;
50 }
51
Matteo Martincigh88813932019-10-04 14:40:04 +010052 Version version = m_PacketVersionResolver.ResolvePacketVersion(packet.GetPacketId());
53
54 CommandHandlerFunctor* commandHandlerFunctor =
55 m_CommandHandlerRegistry.GetFunctor(packet.GetPacketId(), version.GetEncodedValue());
56 BOOST_ASSERT(commandHandlerFunctor);
57 commandHandlerFunctor->operator()(packet);
58 }
59 catch (const armnn::TimeoutException&)
60 {
Matteo Martincighd0613b52019-10-09 16:47:04 +010061 if (m_StopAfterTimeout.load())
Matteo Martincigh88813932019-10-04 14:40:04 +010062 {
Matteo Martincighd0613b52019-10-09 16:47:04 +010063 m_KeepRunning.store(false);
Matteo Martincigh88813932019-10-04 14:40:04 +010064 }
65 }
Matteo Martincigh54fb9572019-10-02 12:50:57 +010066 catch (const Exception& e)
Matteo Martincigh88813932019-10-04 14:40:04 +010067 {
Matteo Martincighd0613b52019-10-09 16:47:04 +010068 // Log the error and continue
69 BOOST_LOG_TRIVIAL(warning) << "An error has occurred when handling a command: " << e.what() << std::endl;
Matteo Martincigh88813932019-10-04 14:40:04 +010070 }
Matteo Martincigh88813932019-10-04 14:40:04 +010071 }
Matteo Martincighc2728f92019-10-07 12:35:21 +010072 while (m_KeepRunning.load());
Matteo Martincigh88813932019-10-04 14:40:04 +010073
Matteo Martincighc2728f92019-10-07 12:35:21 +010074 m_IsRunning.store(false);
Matteo Martincigh88813932019-10-04 14:40:04 +010075}
76
77} // namespace profiling
78
79} // namespace armnn