// // Copyright © 2019 Arm Ltd. All rights reserved. // SPDX-License-Identifier: MIT // #include "PeriodicCounterCapture.hpp" namespace armnn { namespace profiling { PeriodicCounterCapture::PeriodicCounterCapture(const Holder& data, ISendCounterPacket& packet, const IReadCounterValue& readCounterValue) : m_CaptureDataHolder(data) , m_IsRunning(false) , m_ReadCounterValue(readCounterValue) , m_SendCounterPacket(packet) {} CaptureData PeriodicCounterCapture::ReadCaptureData() { return m_CaptureDataHolder.GetCaptureData(); } void PeriodicCounterCapture::Functionality(const IReadCounterValue& readCounterValue) { bool threadRunning = true; while(threadRunning) { auto currentCaptureData = ReadCaptureData(); std::vector counterIds = currentCaptureData.GetCounterIds(); if (currentCaptureData.GetCapturePeriod() == 0 || counterIds.empty()) { threadRunning = false; m_IsRunning.store(false, std::memory_order_relaxed); } else { std::vector> values; auto numCounters = counterIds.size(); values.reserve(numCounters); // Create vector of pairs of CounterIndexes and Values uint32_t counterValue; for (uint16_t index = 0; index < numCounters; ++index) { auto requestedId = counterIds[index]; readCounterValue.GetCounterValue(requestedId, counterValue); values.emplace_back(std::make_pair(requestedId, counterValue)); } #if USE_CLOCK_MONOTONIC_RAW using clock = MonotonicClockRaw; #else using clock = std::chrono::steady_clock; #endif // Take a timestamp auto timestamp = clock::now(); m_SendCounterPacket.SendPeriodicCounterCapturePacket( static_cast(timestamp.time_since_epoch().count()), values); std::this_thread::sleep_for(std::chrono::milliseconds(currentCaptureData.GetCapturePeriod())); } } } void PeriodicCounterCapture::Start() { bool tstVal = false; if (m_IsRunning.compare_exchange_strong(tstVal, true, std::memory_order_relaxed)) { // Check that the thread execution is finished. if (m_PeriodCaptureThread.joinable()) { m_PeriodCaptureThread.join(); } // Starts the new thread. m_PeriodCaptureThread = std::thread(&PeriodicCounterCapture::Functionality, this, std::ref(m_ReadCounterValue)); } } void PeriodicCounterCapture::Join() { m_PeriodCaptureThread.join(); } } // namespace profiling } // namespace armnn