From e63a026bd987e78bdaa5b94c3e53201b62011faa Mon Sep 17 00:00:00 2001 From: Finn Williams Date: Tue, 22 Oct 2019 10:30:49 +0100 Subject: IVGCVSW-3951 Create the timeline decoder * Added ITimelineDecoder.h C interface * Added an example implementation of ITimelineDecoder.h * Added command handlers for the timeline directory and objects * Added tests for the decoder implementation * Changed ReadSwTraceMessage to take a const unsigned char* so it can be used by the directory command handler * Fixed some bugs in ProfilingUtils.cpp and related tests Change-Id: If06faf1fe0274a8f022f194a6d3527f5ce5374c6 Signed-off-by: Finn Williams --- src/profiling/DirectoryCaptureCommandHandler.cpp | 1 + src/profiling/ProfilingUtils.cpp | 16 +++++++++------- src/profiling/ProfilingUtils.hpp | 2 +- src/profiling/test/SendTimelinePacketTests.cpp | 18 +++++++++++------- src/profiling/test/TimelinePacketTests.cpp | 7 ++++++- src/profiling/test/TimelineUtilityMethodsTests.cpp | 2 +- 6 files changed, 29 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/profiling/DirectoryCaptureCommandHandler.cpp b/src/profiling/DirectoryCaptureCommandHandler.cpp index 22d1e6d0dd..c5a2d97293 100644 --- a/src/profiling/DirectoryCaptureCommandHandler.cpp +++ b/src/profiling/DirectoryCaptureCommandHandler.cpp @@ -3,6 +3,7 @@ // SPDX-License-Identifier: MIT // +#include #include "DirectoryCaptureCommandHandler.hpp" #include "SendCounterPacket.hpp" diff --git a/src/profiling/ProfilingUtils.cpp b/src/profiling/ProfilingUtils.cpp index b649747df1..4dde235ecc 100644 --- a/src/profiling/ProfilingUtils.cpp +++ b/src/profiling/ProfilingUtils.cpp @@ -347,7 +347,7 @@ uint32_t CalculateSizeOfPaddedSwString(const std::string& str) } // Read TimelineMessageDirectoryPacket from given IPacketBuffer and offset -SwTraceMessage ReadSwTraceMessage(const IPacketBufferPtr& packetBuffer, unsigned int& offset) +SwTraceMessage ReadSwTraceMessage(const unsigned char* packetBuffer, unsigned int& offset) { BOOST_ASSERT(packetBuffer); @@ -369,7 +369,7 @@ SwTraceMessage ReadSwTraceMessage(const IPacketBufferPtr& packetBuffer, unsigned offset += uint32_t_size; std::vector swTraceStringBuffer(swTraceDeclNameLength - 1); std::memcpy(swTraceStringBuffer.data(), - packetBuffer->GetReadableData() + offset, swTraceStringBuffer.size()); + packetBuffer + offset, swTraceStringBuffer.size()); swTraceMessage.name.assign(swTraceStringBuffer.begin(), swTraceStringBuffer.end()); // name @@ -380,7 +380,7 @@ SwTraceMessage ReadSwTraceMessage(const IPacketBufferPtr& packetBuffer, unsigned offset += uint32_t_size; swTraceStringBuffer.resize(swTraceUINameLength - 1); std::memcpy(swTraceStringBuffer.data(), - packetBuffer->GetReadableData() + offset, swTraceStringBuffer.size()); + packetBuffer + offset, swTraceStringBuffer.size()); swTraceMessage.uiName.assign(swTraceStringBuffer.begin(), swTraceStringBuffer.end()); // ui_name @@ -391,7 +391,7 @@ SwTraceMessage ReadSwTraceMessage(const IPacketBufferPtr& packetBuffer, unsigned offset += uint32_t_size; swTraceStringBuffer.resize(swTraceArgTypesLength - 1); std::memcpy(swTraceStringBuffer.data(), - packetBuffer->GetReadableData() + offset, swTraceStringBuffer.size()); + packetBuffer + offset, swTraceStringBuffer.size()); swTraceMessage.argTypes.assign(swTraceStringBuffer.begin(), swTraceStringBuffer.end()); // arg_types @@ -404,7 +404,7 @@ SwTraceMessage ReadSwTraceMessage(const IPacketBufferPtr& packetBuffer, unsigned offset += uint32_t_size; swTraceStringBuffer.resize(swTraceArgNamesLength - 1); std::memcpy(swTraceStringBuffer.data(), - packetBuffer->GetReadableData() + offset, swTraceStringBuffer.size()); + packetBuffer + offset, swTraceStringBuffer.size()); swTraceString.assign(swTraceStringBuffer.begin(), swTraceStringBuffer.end()); std::stringstream stringStream(swTraceString); @@ -536,12 +536,11 @@ TimelinePacketStatus WriteTimelineEntityBinaryPacket(uint64_t profilingGuid, unsigned int uint64_t_size = sizeof(uint64_t); // Calculate the length of the data (in bytes) - unsigned int timelineEntityPacketDataLength = uint64_t_size; // Profiling GUID + unsigned int timelineEntityPacketDataLength = uint32_t_size + uint64_t_size; // decl_id + Profiling GUID // Calculate the timeline binary packet size (in bytes) unsigned int timelineEntityPacketSize = 2 * uint32_t_size + // Header (2 words) - uint32_t_size + // decl_Id timelineEntityPacketDataLength; // Profiling GUID // Check whether the timeline binary packet fits in the given buffer @@ -744,6 +743,9 @@ TimelinePacketStatus WriteTimelineMessageDirectoryPackage(unsigned char* buffer, WriteUint32(buffer, offset, packetHeader.second); offset += uint32_t_size; + WriteUint32(buffer, offset, static_cast(swTraceTimelineDirectoryMessages.size())); + offset += uint32_t_size; + for (unsigned int i = 0u; i < swTraceTimelineDirectoryMessages.size(); ++i) { // Write the timeline binary packet payload to the buffer diff --git a/src/profiling/ProfilingUtils.hpp b/src/profiling/ProfilingUtils.hpp index 74fc437333..f7b46be972 100644 --- a/src/profiling/ProfilingUtils.hpp +++ b/src/profiling/ProfilingUtils.hpp @@ -156,7 +156,7 @@ enum class ProfilingRelationshipType uint32_t CalculateSizeOfPaddedSwString(const std::string& str); -SwTraceMessage ReadSwTraceMessage(const IPacketBufferPtr& packetBuffer, unsigned int& offset); +SwTraceMessage ReadSwTraceMessage(const unsigned char*, unsigned int& offset); TimelinePacketStatus WriteTimelineLabelBinaryPacket(uint64_t profilingGuid, const std::string& label, diff --git a/src/profiling/test/SendTimelinePacketTests.cpp b/src/profiling/test/SendTimelinePacketTests.cpp index 60cda9a657..7f3094918d 100644 --- a/src/profiling/test/SendTimelinePacketTests.cpp +++ b/src/profiling/test/SendTimelinePacketTests.cpp @@ -53,7 +53,11 @@ BOOST_AUTO_TEST_CASE(SendTimelineMessageDirectoryPackageTest) BOOST_CHECK(dataLength == 416); offset += uint32_t_size; - SwTraceMessage swTraceMessage = ReadSwTraceMessage(packetBuffer, offset); + uint32_t DeclCount = ReadUint32(packetBuffer, offset); + BOOST_CHECK(DeclCount == 5); + + offset += uint32_t_size; + SwTraceMessage swTraceMessage = ReadSwTraceMessage(packetBuffer->GetReadableData(), offset); BOOST_CHECK(swTraceMessage.id == 0); BOOST_CHECK(swTraceMessage.name == "declareLabel"); @@ -65,7 +69,7 @@ BOOST_AUTO_TEST_CASE(SendTimelineMessageDirectoryPackageTest) BOOST_CHECK(swTraceMessage.argNames[0] == "guid"); BOOST_CHECK(swTraceMessage.argNames[1] == "value"); - swTraceMessage = ReadSwTraceMessage(packetBuffer, offset); + swTraceMessage = ReadSwTraceMessage(packetBuffer->GetReadableData(), offset); BOOST_CHECK(swTraceMessage.id == 1); BOOST_CHECK(swTraceMessage.name == "declareEntity"); @@ -75,7 +79,7 @@ BOOST_AUTO_TEST_CASE(SendTimelineMessageDirectoryPackageTest) BOOST_CHECK(swTraceMessage.argNames.size() == 1); BOOST_CHECK(swTraceMessage.argNames[0] == "guid"); - swTraceMessage = ReadSwTraceMessage(packetBuffer, offset); + swTraceMessage = ReadSwTraceMessage(packetBuffer->GetReadableData(), offset); BOOST_CHECK(swTraceMessage.id == 2); BOOST_CHECK(swTraceMessage.name == "declareEventClass"); @@ -85,7 +89,7 @@ BOOST_AUTO_TEST_CASE(SendTimelineMessageDirectoryPackageTest) BOOST_CHECK(swTraceMessage.argNames.size() == 1); BOOST_CHECK(swTraceMessage.argNames[0] == "guid"); - swTraceMessage = ReadSwTraceMessage(packetBuffer, offset); + swTraceMessage = ReadSwTraceMessage(packetBuffer->GetReadableData(), offset); BOOST_CHECK(swTraceMessage.id == 3); BOOST_CHECK(swTraceMessage.name == "declareRelationship"); @@ -101,7 +105,7 @@ BOOST_AUTO_TEST_CASE(SendTimelineMessageDirectoryPackageTest) BOOST_CHECK(swTraceMessage.argNames[2] == "headGuid"); BOOST_CHECK(swTraceMessage.argNames[3] == "tailGuid"); - swTraceMessage = ReadSwTraceMessage(packetBuffer, offset); + swTraceMessage = ReadSwTraceMessage(packetBuffer->GetReadableData(), offset); BOOST_CHECK(swTraceMessage.id == 4); BOOST_CHECK(swTraceMessage.name == "declareEvent"); @@ -157,7 +161,7 @@ BOOST_AUTO_TEST_CASE(SendTimelineEntityPlusEventClassBinaryPacketTest) uint32_t entityBinaryPacketSequenceNumbered = (entityBinaryPacketHeaderWord1 >> 24) & 0x00000001; uint32_t entityBinaryPacketDataLength = (entityBinaryPacketHeaderWord1 >> 0) & 0x00FFFFFF; BOOST_CHECK(entityBinaryPacketSequenceNumbered == 0); - BOOST_CHECK(entityBinaryPacketDataLength == 8); + BOOST_CHECK(entityBinaryPacketDataLength == 12); // Check the decl_id offset += uint32_t_size; @@ -243,7 +247,7 @@ BOOST_AUTO_TEST_CASE(SendTimelinePacketTests1) uint32_t entityBinaryPacketSequenceNumbered = (entityBinaryPacketHeaderWord1 >> 24) & 0x00000001; uint32_t entityBinaryPacketDataLength = (entityBinaryPacketHeaderWord1 >> 0) & 0x00FFFFFF; BOOST_CHECK(entityBinaryPacketSequenceNumbered == 0); - BOOST_CHECK(entityBinaryPacketDataLength == 8); + BOOST_CHECK(entityBinaryPacketDataLength == 12); // Check the decl_id offset += uint32_t_size; diff --git a/src/profiling/test/TimelinePacketTests.cpp b/src/profiling/test/TimelinePacketTests.cpp index 6a8aa85fc0..68cd948bdd 100644 --- a/src/profiling/test/TimelinePacketTests.cpp +++ b/src/profiling/test/TimelinePacketTests.cpp @@ -543,6 +543,11 @@ BOOST_AUTO_TEST_CASE(TimelineMessageDirectoryPacketTest3) BOOST_CHECK(sequenceNumbered == 0); BOOST_CHECK(dataLength == 416); + // Check the number of declarations + offset += uint32_t_size; + uint32_t declCount = ReadUint32(buffer.data(), offset); + BOOST_CHECK(declCount == 5); + // Check the decl_id offset += uint32_t_size; uint32_t readDeclId = ReadUint32(buffer.data(), offset); @@ -689,7 +694,7 @@ BOOST_AUTO_TEST_CASE(TimelineEntityPacketTest4) uint32_t sequenceNumbered = (packetHeaderWord1 >> 24) & 0x00000001; uint32_t dataLength = (packetHeaderWord1 >> 0) & 0x00FFFFFF; BOOST_CHECK(sequenceNumbered == 0); - BOOST_CHECK(dataLength == 8); + BOOST_CHECK(dataLength == 12); // Check decl_Id offset += uint32_t_size; diff --git a/src/profiling/test/TimelineUtilityMethodsTests.cpp b/src/profiling/test/TimelineUtilityMethodsTests.cpp index 3556a12a7b..f784afc6ef 100644 --- a/src/profiling/test/TimelineUtilityMethodsTests.cpp +++ b/src/profiling/test/TimelineUtilityMethodsTests.cpp @@ -258,7 +258,7 @@ void VerifyTimelineEntityBinaryPacket(Optional guid, uint32_t entityBinaryPacketSequenceNumbered = (entityBinaryPacketHeaderWord1 >> 24) & 0x00000001; uint32_t entityBinaryPacketDataLength = (entityBinaryPacketHeaderWord1 >> 0) & 0x00FFFFFF; BOOST_CHECK(entityBinaryPacketSequenceNumbered == 0); - BOOST_CHECK(entityBinaryPacketDataLength == 8); + BOOST_CHECK(entityBinaryPacketDataLength == 12); // Check the decl_id offset += uint32_t_size; -- cgit v1.2.1