IVGCVSW-3964 Implement the Periodic Counter Selection command handler

 * Improved the PeriodicCounterPacket class to handle errors properly
 * Improved the PeriodicCounterSelectionCommandHandler to handle
   invalid counter UIDs in the selection packet
 * Added the Periodic Counter Selection command handler to the
   ProfilingService class
 * Code refactoring and added comments
 * Added WaitForPacketSent method to the SendCounterPacket class
   to allow waiting for the packets to be sent (useful in the
   unit tests)
 * Added unit tests and updated the old ones accordingly
 * Fixed threading issues with a number of unit tests

Signed-off-by: Matteo Martincigh <matteo.martincigh@arm.com>
Change-Id: I271b7b0bfa801d88fe1725b934d24e30cd839ed7
diff --git a/src/profiling/SendCounterPacket.hpp b/src/profiling/SendCounterPacket.hpp
index 9361efb..e1a42aa 100644
--- a/src/profiling/SendCounterPacket.hpp
+++ b/src/profiling/SendCounterPacket.hpp
@@ -65,6 +65,14 @@
     void Stop(bool rethrowSendThreadExceptions = true);
     bool IsRunning() { return m_IsRunning.load(); }
 
+    void WaitForPacketSent()
+    {
+        std::unique_lock<std::mutex> lock(m_PacketSentWaitMutex);
+
+        // Blocks until notified that at least a packet has been sent
+        m_PacketSentWaitCondition.wait(lock);
+    }
+
 private:
     void Send(IProfilingConnection& profilingConnection);
 
@@ -93,7 +101,7 @@
         throw ExceptionType(errorMessage);
     }
 
-    void FlushBuffer(IProfilingConnection& profilingConnection);
+    void FlushBuffer(IProfilingConnection& profilingConnection, bool notifyWatchers = true);
 
     ProfilingStateMachine& m_StateMachine;
     IBufferManager& m_BufferManager;
@@ -104,6 +112,8 @@
     std::atomic<bool> m_IsRunning;
     std::atomic<bool> m_KeepRunning;
     std::exception_ptr m_SendThreadException;
+    std::mutex m_PacketSentWaitMutex;
+    std::condition_variable m_PacketSentWaitCondition;
 
 protected:
     // Helper methods, protected for testing