1 /* 2 * Copyright (c) 2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef HIVIEW_FRAMEWORK_NATIVE_PROCESS_STATE_INFO_COLLECTION_H 17 #define HIVIEW_FRAMEWORK_NATIVE_PROCESS_STATE_INFO_COLLECTION_H 18 19 #include <mutex> 20 21 #include "collect_device_client.h" 22 #include "cpu_calculator.h" 23 #include "cpu_collector.h" 24 #include "cpu_util.h" 25 #include "process_cpu_data.h" 26 27 namespace OHOS { 28 namespace HiviewDFX { 29 namespace UCollectUtil { 30 constexpr int32_t INVALID_PID = 0; 31 struct ProcessCpuTimeInfo { 32 uint32_t minFlt = 0; 33 uint32_t majFlt = 0; 34 uint64_t uUsageTime = 0; 35 uint64_t sUsageTime = 0; 36 uint64_t loadTime = 0; 37 uint64_t collectionTime = 0; 38 uint64_t collectionBootTime = 0; 39 }; 40 41 class ProcessStatInfoCollector { 42 public: 43 ProcessStatInfoCollector(std::shared_ptr<CollectDeviceClient> deviceClient, 44 std::shared_ptr<CpuCalculator> cpuCalculator); 45 ~ProcessStatInfoCollector() = default; 46 47 public: 48 CollectResult<ProcessCpuStatInfo> CollectProcessCpuStatInfo(int32_t pid, 49 bool isNeedUpdate = false); 50 CollectResult<std::vector<ProcessCpuStatInfo>> CollectProcessCpuStatInfos( 51 bool isNeedUpdate = false); 52 53 private: 54 void InitLastProcCpuTimeInfos(); 55 CalculationTimeInfo InitCalculationTimeInfo(); 56 CalculationTimeInfo InitCalculationTimeInfo(int32_t pid); 57 std::shared_ptr<ProcessCpuData> FetchProcessCpuData(int32_t pid = INVALID_PID); 58 void UpdateCollectionTime(const CalculationTimeInfo& calcTimeInfo); 59 void UpdateLastProcCpuTimeInfo(const ucollection_process_cpu_item* procCpuItem, 60 const CalculationTimeInfo& calcTimeInfo); 61 void CalculateProcessCpuStatInfos( 62 std::vector<ProcessCpuStatInfo>& processCpuStatInfos, 63 std::shared_ptr<ProcessCpuData> processCpuData, 64 bool isNeedUpdate); 65 std::optional<ProcessCpuStatInfo> CalculateProcessCpuStatInfo( 66 const ucollection_process_cpu_item* procCpuItem, const CalculationTimeInfo& calcTimeInfo); 67 void TryToDeleteDeadProcessInfo(); 68 void TryToDeleteDeadProcessInfoByPid(int32_t pid); 69 void TryToDeleteDeadProcessInfoByTime(uint64_t collectionBootTime); 70 71 private: 72 std::mutex collectMutex_; 73 uint64_t lastCollectionTime_ = 0; 74 uint64_t lastCollectionBootTime_ = 0; 75 std::shared_ptr<CollectDeviceClient> deviceClient_; 76 /* map<pid, ProcessCpuTimeInfo> */ 77 std::unordered_map<int32_t, ProcessCpuTimeInfo> lastProcCpuTimeInfos_; 78 std::shared_ptr<CpuCalculator> cpuCalculator_; 79 }; 80 } // namespace UCollectUtil 81 } // namespace HiviewDFX 82 } // namespace OHOS 83 #endif // HIVIEW_FRAMEWORK_NATIVE_PROCESS_STATE_INFO_COLLECTION_H