diff options
author | Colm Donelan <Colm.Donelan@arm.com> | 2019-11-14 14:19:07 +0000 |
---|---|---|
committer | Matteo Martincigh <matteo.martincigh@arm.com> | 2019-11-15 17:11:01 +0000 |
commit | 0270524f96c4e21a755d1c71e46c4e8665918237 (patch) | |
tree | 1ce1fc3fd51f568e15e84e0281410b6b53de2fe5 /tests/profiling/gatordmock | |
parent | 9723d0243463e3a32ed11ae1c38298343b4e8818 (diff) | |
download | armnn-0270524f96c4e21a755d1c71e46c4e8665918237.tar.gz |
IVGCVSW-4129 Fix thread starvation due to low capture periods
* Set default capture period to 10mSec.
* Validate capture period in PeriodicCounterSelectionCommandHandler
pull it up to 10mSec if it is lower.
* Fix segmentation fault in GatordMock when receive thread closes.
Signed-off-by: Colm Donelan <Colm.Donelan@arm.com>
Change-Id: I9f7ddc70bd99c102c5baef872d28329976a4dc07
Diffstat (limited to 'tests/profiling/gatordmock')
-rw-r--r-- | tests/profiling/gatordmock/CommandFileParser.cpp | 2 | ||||
-rw-r--r-- | tests/profiling/gatordmock/GatordMockService.cpp | 18 | ||||
-rw-r--r-- | tests/profiling/gatordmock/GatordMockService.hpp | 7 |
3 files changed, 23 insertions, 4 deletions
diff --git a/tests/profiling/gatordmock/CommandFileParser.cpp b/tests/profiling/gatordmock/CommandFileParser.cpp index d08e72cadd..4a8a19b5d2 100644 --- a/tests/profiling/gatordmock/CommandFileParser.cpp +++ b/tests/profiling/gatordmock/CommandFileParser.cpp @@ -23,7 +23,7 @@ void CommandFileParser::ParseFile(std::string CommandFile, GatordMockService& mo std::cout << "Parsing command file: " << CommandFile << std::endl; - while (std::getline(infile, line)) + while (mockService.ReceiveThreadRunning() && std::getline(infile, line)) { std::istringstream iss(line); diff --git a/tests/profiling/gatordmock/GatordMockService.cpp b/tests/profiling/gatordmock/GatordMockService.cpp index 1cdb024273..529ef063dd 100644 --- a/tests/profiling/gatordmock/GatordMockService.cpp +++ b/tests/profiling/gatordmock/GatordMockService.cpp @@ -166,7 +166,11 @@ bool GatordMockService::LaunchReceivingThread() void GatordMockService::WaitForReceivingThread() { - m_CloseReceivingThread.store(true); + // The receiving thread may already have died. + if (m_CloseReceivingThread != true) + { + m_CloseReceivingThread.store(true); + } // Check that the receiving thread is running if (m_ListeningThread.joinable()) { @@ -210,8 +214,16 @@ void GatordMockService::SendPeriodicCounterSelectionList(uint32_t period, std::v void GatordMockService::WaitCommand(uint timeout) { - std::this_thread::sleep_for(std::chrono::microseconds(timeout)); - + // Wait for a maximum of timeout microseconds or if the receive thread has closed. + // There is a certain level of rounding involved in this timing. + uint iterations = timeout / 1000; + std::cout << std::dec << "Wait command with timeout of " << timeout << " iterations = " << iterations << std::endl; + uint count = 0; + while ((this->ReceiveThreadRunning() && (count < iterations))) + { + std::this_thread::sleep_for(std::chrono::microseconds(1000)); + ++count; + } if (m_EchoPackets) { std::cout << std::dec << "Wait command with timeout of " << timeout << " microseconds completed. " << std::endl; diff --git a/tests/profiling/gatordmock/GatordMockService.hpp b/tests/profiling/gatordmock/GatordMockService.hpp index a77d7ff480..c3afc333ca 100644 --- a/tests/profiling/gatordmock/GatordMockService.hpp +++ b/tests/profiling/gatordmock/GatordMockService.hpp @@ -41,6 +41,7 @@ public: GatordMockService(armnn::profiling::CommandHandlerRegistry& registry, bool echoPackets) : m_HandlerRegistry(registry) , m_EchoPackets(echoPackets) + , m_CloseReceivingThread(false) { m_PacketsReceivedCount.store(0, std::memory_order_relaxed); } @@ -86,6 +87,12 @@ public: /// command handling code is added. void WaitForReceivingThread(); + // @return true only if the receive thread is closed or closing. + bool ReceiveThreadRunning() + { + return !m_CloseReceivingThread.load(); + } + /// Send the counter list to ArmNN. void SendPeriodicCounterSelectionList(uint32_t period, std::vector<uint16_t> counters); |