IVGCVSW-4124 Replacing the "sleep_for" loop from FileOnlyProfilingConnection
authorColm Donelan <Colm.Donelan@arm.com>
Wed, 20 Nov 2019 14:59:12 +0000 (14:59 +0000)
committerKeith Davis Arm <keith.davis@arm.com>
Thu, 21 Nov 2019 10:06:08 +0000 (10:06 +0000)
* Replacing the "sleep_for" loop in FileOnlyProfilingConnection with
  a producer consumer conditional mutex.
* Reducing the times sleep loop times in FileOnlyProfilingDecoratorTests.

Signed-off-by: Colm Donelan <Colm.Donelan@arm.com>
Change-Id: Ied2302b508b6e4e6b50809c77e3f19115449d0b6

src/profiling/FileOnlyProfilingConnection.cpp
src/profiling/FileOnlyProfilingConnection.hpp
src/profiling/test/FileOnlyProfilingDecoratorTests.cpp

index b32ae49..004e27d 100644 (file)
@@ -69,7 +69,11 @@ void FileOnlyProfilingConnection::SendConnectionAck()
         std::cout << "Sending connection acknowledgement." << std::endl;
     }
     std::unique_ptr<unsigned char[]> uniqueNullPtr = nullptr;
-    m_PacketQueue.push(Packet(0x10000, 0, uniqueNullPtr));
+    {
+        std::lock_guard<std::mutex> lck(m_PacketAvailableMutex);
+        m_PacketQueue.push(Packet(0x10000, 0, uniqueNullPtr));
+    }
+    m_ConditionPacketAvailable.notify_one();
 }
 
 bool FileOnlyProfilingConnection::SendCounterSelectionPacket()
@@ -94,7 +98,11 @@ bool FileOnlyProfilingConnection::SendCounterSelectionPacket()
         offset += uint16_t_size;
     }
 
-    m_PacketQueue.push(Packet(0x40000, bodySize, uniqueData));
+    {
+        std::lock_guard<std::mutex> lck(m_PacketAvailableMutex);
+        m_PacketQueue.push(Packet(0x40000, bodySize, uniqueData));
+    }
+    m_ConditionPacketAvailable.notify_one();
 
     return true;
 }
@@ -155,13 +163,10 @@ bool FileOnlyProfilingConnection::WritePacket(const unsigned char* buffer, uint3
 
 Packet FileOnlyProfilingConnection::ReadPacket(uint32_t timeout)
 {
-    uint16_t loopCount       = 10;
-    uint32_t timeoutFraction = timeout / loopCount;
-    while (m_PacketQueue.empty())
+    std::unique_lock<std::mutex> lck(m_PacketAvailableMutex);
+    if (m_PacketQueue.empty())
     {
-        std::this_thread::sleep_for(std::chrono::milliseconds(timeoutFraction));
-        --loopCount;
-        if ((loopCount) == 0)
+        if(m_ConditionPacketAvailable.wait_for(lck, std::chrono::milliseconds(timeout)) == std::cv_status::timeout)
         {
             throw armnn::TimeoutException("Thread has timed out as per requested time limit");
         }
index 12a87a1..d4477b6 100644 (file)
@@ -11,6 +11,7 @@
 #include "ProfilingUtils.hpp"
 #include "Runtime.hpp"
 
+#include <condition_variable>
 #include <fstream>
 #include <queue>
 
@@ -75,6 +76,9 @@ private:
     std::vector<uint16_t> m_IdList;
     std::queue<Packet> m_PacketQueue;
     TargetEndianness m_Endianness;
+
+    std::mutex m_PacketAvailableMutex;
+    std::condition_variable m_ConditionPacketAvailable;
 };
 
 }    // namespace profiling
index 5524ed4..d4907b6 100644 (file)
@@ -45,8 +45,8 @@ BOOST_AUTO_TEST_CASE(DumpOutgoingValidFileEndToEnd)
     profilingService.Update();
     profilingService.Update();
 
-    uint32_t timeout   = 2000;
-    uint32_t sleepTime = 50;
+    uint32_t timeout   = 25; // Wait for a maximum of 25mSec
+    uint32_t sleepTime = 1;  // in 1mSec intervals.
     uint32_t timeSlept = 0;
 
     // Give the profiling service sending thread time start executing and send the stream metadata.