1 /*
2  * Copyright (c) 2023-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 #include "cpu_collector_impl.h"
17 
18 #include <memory>
19 
20 #include "cpu_decorator.h"
21 #include "hiview_logger.h"
22 
23 namespace OHOS {
24 namespace HiviewDFX {
25 namespace UCollectUtil {
26 DEFINE_LOG_TAG("CpuCollector");
CpuCollectorImpl()27 CpuCollectorImpl::CpuCollectorImpl()
28 {
29     cpuCalculator_ = std::make_shared<CpuCalculator>();
30     usageCollector_ = std::make_shared<SysCpuUsageCollector>(cpuCalculator_);
31     if (InitDeviceClient()) {
32         statInfoCollector_ = std::make_shared<ProcessStatInfoCollector>(deviceClient_, cpuCalculator_);
33     }
34 }
35 
InitDeviceClient()36 bool CpuCollectorImpl::InitDeviceClient()
37 {
38     deviceClient_ = std::make_shared<CollectDeviceClient>();
39     if (deviceClient_->Open() != 0) {
40         HIVIEW_LOGE("failed to open device client");
41         deviceClient_ = nullptr;
42         return false;
43     }
44     return true;
45 }
46 
Create(bool isSingleton)47 std::shared_ptr<CpuCollector> CpuCollector::Create(bool isSingleton)
48 {
49     if (!isSingleton) {
50         return std::make_shared<CpuDecorator>(std::make_shared<CpuCollectorImpl>());
51     }
52     static std::shared_ptr<CpuCollector> instance_ =
53         std::make_shared<CpuDecorator>(std::make_shared<CpuCollectorImpl>());
54     return instance_;
55 }
56 
CollectSysCpuLoad()57 CollectResult<SysCpuLoad> CpuCollectorImpl::CollectSysCpuLoad()
58 {
59     CollectResult<SysCpuLoad> result;
60     result.retCode = CpuUtil::GetSysCpuLoad(result.data);
61     return result;
62 }
63 
CollectSysCpuUsage(bool isNeedUpdate)64 CollectResult<SysCpuUsage> CpuCollectorImpl::CollectSysCpuUsage(bool isNeedUpdate)
65 {
66     if (usageCollector_ != nullptr) {
67         return usageCollector_->CollectSysCpuUsage(isNeedUpdate);
68     }
69     CollectResult<SysCpuUsage> error;
70     return error;
71 }
72 
GetSysCpuUsage()73 CollectResult<double> CpuCollectorImpl::GetSysCpuUsage()
74 {
75     auto sysCpuUsage = CollectSysCpuUsage();
76     double retValue = 0;
77     if (!sysCpuUsage.data.cpuInfos.empty()) {
78         const auto &totalCpuUsageInfo = sysCpuUsage.data.cpuInfos.at(0);
79         retValue += (totalCpuUsageInfo.userUsage + totalCpuUsageInfo.niceUsage + totalCpuUsageInfo.systemUsage);
80     }
81     CollectResult<double> result = {};
82     result.retCode = UCollect::UcError::SUCCESS;
83     result.data = retValue;
84     return result;
85 }
86 
CollectCpuFrequency()87 CollectResult<std::vector<CpuFreq>> CpuCollectorImpl::CollectCpuFrequency()
88 {
89     CollectResult<std::vector<CpuFreq>> result;
90     result.retCode = CpuUtil::GetCpuFrequency(result.data);
91     return result;
92 }
93 
CollectProcessCpuStatInfos(bool isNeedUpdate)94 CollectResult<std::vector<ProcessCpuStatInfo>> CpuCollectorImpl::CollectProcessCpuStatInfos(bool isNeedUpdate)
95 {
96     if (statInfoCollector_ != nullptr) {
97         return statInfoCollector_->CollectProcessCpuStatInfos(isNeedUpdate);
98     }
99     CollectResult<std::vector<ProcessCpuStatInfo>> error;
100     return error;
101 }
102 
CollectProcessCpuStatInfo(int32_t pid,bool isNeedUpdate)103 CollectResult<ProcessCpuStatInfo> CpuCollectorImpl::CollectProcessCpuStatInfo(int32_t pid, bool isNeedUpdate)
104 {
105     if (statInfoCollector_ != nullptr) {
106         return statInfoCollector_->CollectProcessCpuStatInfo(pid, isNeedUpdate);
107     }
108     CollectResult<ProcessCpuStatInfo> error;
109     return error;
110 }
111 
CreateThreadCollector(int pid)112 std::shared_ptr<ThreadCpuCollector> CpuCollectorImpl::CreateThreadCollector(int pid)
113 {
114     if (deviceClient_ == nullptr) {
115         return nullptr;
116     }
117     return std::make_shared<ThreadStateInfoCollector>(deviceClient_, cpuCalculator_, pid);
118 }
119 } // UCollectUtil
120 } // HiViewDFX
121 } // OHOS
122