11 #include <boost/numeric/conversion/cast.hpp> 35 for (
unsigned int i = 0; i < m_PacketQueue.size(); i++)
41 bool FileOnlyProfilingConnection::WaitForStreamMeta(
const unsigned char* buffer, uint32_t length)
48 Fail(
"Protocol error. The stream_metadata_identifer was not 0.");
62 Fail(
"Protocol read error. Unable to read PIPE_MAGIC value.");
67 void FileOnlyProfilingConnection::SendConnectionAck()
71 std::cout <<
"Sending connection acknowledgement." << std::endl;
73 std::unique_ptr<unsigned char[]> uniqueNullPtr =
nullptr;
75 std::lock_guard<std::mutex> lck(m_PacketAvailableMutex);
76 m_PacketQueue.push(
Packet(0x10000, 0, uniqueNullPtr));
78 m_ConditionPacketAvailable.notify_one();
81 bool FileOnlyProfilingConnection::SendCounterSelectionPacket()
87 uint32_t bodySize = uint32_t_size +
boost::numeric_cast<uint32_t>(m_IdList.size()) * uint16_t_size;
89 auto uniqueData = std::make_unique<unsigned char[]>(bodySize);
90 unsigned char* data =
reinterpret_cast<unsigned char*
>(uniqueData.get());
93 WriteUint32(data, offset, m_Options.m_CapturePeriod);
97 for (
const uint16_t&
id : m_IdList)
104 std::lock_guard<std::mutex> lck(m_PacketAvailableMutex);
105 m_PacketQueue.push(
Packet(0x40000, bodySize, uniqueData));
107 m_ConditionPacketAvailable.notify_one();
114 BOOST_ASSERT(buffer);
117 uint32_t outgoingHeaderAsWords[2];
118 PackageActivity packageActivity = GetPackageActivity(buffer, outgoingHeaderAsWords);
120 switch (packageActivity)
124 if (!WaitForStreamMeta(buffer, length))
134 std::unique_ptr<unsigned char[]> uniqueCounterData = std::make_unique<unsigned char[]>(length - 8);
136 std::memcpy(uniqueCounterData.get(), buffer + 8, length - 8);
138 Packet directoryPacket(outgoingHeaderAsWords[0], length - 8, uniqueCounterData);
143 directoryCaptureCommandHandler.operator()(directoryPacket);
144 const ICounterDirectory& counterDirectory = directoryCaptureCommandHandler.GetCounterDirectory();
148 std::vector<uint16_t> translatedCounters;
149 for (
auto const& copyUid : category->m_Counters)
151 translatedCounters.emplace_back(directoryCaptureCommandHandler.TranslateUIDCopyToOriginal(copyUid));
153 m_IdList.insert(std::end(m_IdList), std::begin(translatedCounters), std::end(translatedCounters));
155 SendCounterSelectionPacket();
168 std::unique_lock<std::mutex> lck(m_PacketAvailableMutex);
172 if(!m_ConditionPacketAvailable.wait_for(lck,
173 std::chrono::milliseconds(timeout),
174 [&]{return !m_PacketQueue.empty();}))
179 Packet returnedPacket = std::move(m_PacketQueue.front());
181 return returnedPacket;
184 PackageActivity FileOnlyProfilingConnection::GetPackageActivity(
const unsigned char* buffer, uint32_t headerAsWords[2])
186 headerAsWords[0] = ToUint32(buffer, m_Endianness);
187 headerAsWords[1] = ToUint32(buffer + 4, m_Endianness);
188 if (headerAsWords[0] == 0x20000)
192 else if (headerAsWords[0] == 0)
202 uint32_t FileOnlyProfilingConnection::ToUint32(
const unsigned char* data,
TargetEndianness endianness)
208 return static_cast<uint32_t
>(data[0]) << 24 | static_cast<uint32_t>(data[1]) << 16 |
209 static_cast<uint32_t
>(data[2]) << 8 | static_cast<uint32_t>(data[3]);
213 return static_cast<uint32_t
>(data[3]) << 24 | static_cast<uint32_t>(data[2]) << 16 |
214 static_cast<uint32_t
>(data[1]) << 8 | static_cast<uint32_t>(data[0]);
218 void FileOnlyProfilingConnection::Fail(
const std::string& errorMessage)
uint32_t GetEncodedValue()
void WriteUint16(const IPacketBufferPtr &packetBuffer, unsigned int offset, uint16_t value)
void WriteUint32(const IPacketBufferPtr &packetBuffer, unsigned int offset, uint32_t value)
Version ResolvePacketVersion(uint32_t familyId, uint32_t packetId) const
bool IsOpen() const override
Copyright (c) 2020 ARM Limited.
void IgnoreUnused(Ts &&...)
virtual const Categories & GetCategories() const =0
std::enable_if_t< std::is_unsigned< Source >::value &&std::is_unsigned< Dest >::value, Dest > numeric_cast(Source source)
~FileOnlyProfilingConnection()
bool WritePacket(const unsigned char *buffer, uint32_t length) override
Packet ReadPacket(uint32_t timeout) override