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