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