diff --git a/device/plugins/ftrace_plugin/src/flow_controller.cpp b/device/plugins/ftrace_plugin/src/flow_controller.cpp index ee6465adc4eaf72dc8bb357221de7e0c3e990e58..4459e6b3a2c9095f765f48a48f8a68ce0691653d 100644 --- a/device/plugins/ftrace_plugin/src/flow_controller.cpp +++ b/device/plugins/ftrace_plugin/src/flow_controller.cpp @@ -388,7 +388,7 @@ void FlowController::HmCaptureWorkOnNomalModeInner() auto tracePeriod = std::chrono::milliseconds(tracePeriodMs_); ftraceParser_->ParseTidGid(); while (keepRunning_) { - std::this_thread::sleep_for(tracePeriod); + auto start = std::chrono::steady_clock::now(); if (flushCacheData_ && !keepRunning_) { PROFILER_LOG_INFO(LOG_CORE, "flushCacheData_ is true, return"); return; @@ -400,11 +400,25 @@ void FlowController::HmCaptureWorkOnNomalModeInner() } if (rawDataBytes == 0) { PROFILER_LOG_INFO(LOG_CORE, "Get hm raw data is 0 bytes."); + auto duration = + std::chrono::duration_cast(std::chrono::steady_clock::now() - start); + if (tracePeriod > duration) { + std::this_thread::sleep_for(tracePeriod - duration); + } continue; } if (!HmParseEventDataOnNomalMode(rawDataBytes)) { PROFILER_LOG_ERROR(LOG_CORE, "HmParseEventData failed!"); } + auto duration = std::chrono::duration_cast(std::chrono::steady_clock::now() - start); + if (tracePeriod > duration) { + std::this_thread::sleep_for(tracePeriod - duration); + } + } + // read last data + long rawLastDataBytes = HmReadEventData(); + if (rawLastDataBytes > 0 && !HmParseEventDataOnNomalMode(rawLastDataBytes)) { + PROFILER_LOG_ERROR(LOG_CORE, "HmParseEventData failed!"); } tansporter_->Flush(); PROFILER_LOG_INFO(LOG_CORE, "FlowController::HmCaptureWorkOnNomalMode done!");