aboutsummaryrefslogtreecommitdiff
path: root/tests/profiling/gatordmock/GatordMockService.cpp
diff options
context:
space:
mode:
authorColm Donelan <Colm.Donelan@arm.com>2019-11-14 14:19:07 +0000
committerMatteo Martincigh <matteo.martincigh@arm.com>2019-11-15 17:11:01 +0000
commit0270524f96c4e21a755d1c71e46c4e8665918237 (patch)
tree1ce1fc3fd51f568e15e84e0281410b6b53de2fe5 /tests/profiling/gatordmock/GatordMockService.cpp
parent9723d0243463e3a32ed11ae1c38298343b4e8818 (diff)
downloadarmnn-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/GatordMockService.cpp')
-rw-r--r--tests/profiling/gatordmock/GatordMockService.cpp18
1 files changed, 15 insertions, 3 deletions
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;