106f6ba60Sopenharmony_ci/*
206f6ba60Sopenharmony_ci * Copyright (C) 2021 Huawei Device Co., Ltd.
306f6ba60Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
406f6ba60Sopenharmony_ci * you may not use this file except in compliance with the License.
506f6ba60Sopenharmony_ci * You may obtain a copy of the License at
606f6ba60Sopenharmony_ci *
706f6ba60Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
806f6ba60Sopenharmony_ci *
906f6ba60Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1006f6ba60Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1106f6ba60Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1206f6ba60Sopenharmony_ci * See the License for the specific language governing permissions and
1306f6ba60Sopenharmony_ci * limitations under the License.
1406f6ba60Sopenharmony_ci */
1506f6ba60Sopenharmony_ci
1606f6ba60Sopenharmony_ci#include "include/CPU.h"
1706f6ba60Sopenharmony_ci#include <sstream>
1806f6ba60Sopenharmony_ci#include <cstdio>
1906f6ba60Sopenharmony_ci#include <unistd.h>
2006f6ba60Sopenharmony_ci#include <cstring>
2106f6ba60Sopenharmony_ci#include <string>
2206f6ba60Sopenharmony_ci#include <iostream>
2306f6ba60Sopenharmony_ci#include <climits>
2406f6ba60Sopenharmony_ci#include "securec.h"
2506f6ba60Sopenharmony_ci#include "include/sp_utils.h"
2606f6ba60Sopenharmony_ci#include "cpu_collector.h"
2706f6ba60Sopenharmony_ci#include "collect_result.h"
2806f6ba60Sopenharmony_ci#include "include/startup_delay.h"
2906f6ba60Sopenharmony_ci#include "include/sp_log.h"
3006f6ba60Sopenharmony_ci
3106f6ba60Sopenharmony_ciusing namespace OHOS::HiviewDFX;
3206f6ba60Sopenharmony_ciusing namespace OHOS::HiviewDFX::UCollectUtil;
3306f6ba60Sopenharmony_ciusing namespace OHOS::HiviewDFX::UCollect;
3406f6ba60Sopenharmony_ci
3506f6ba60Sopenharmony_cinamespace OHOS {
3606f6ba60Sopenharmony_cinamespace SmartPerf {
3706f6ba60Sopenharmony_cistd::map<std::string, std::string> CPU::ItemData()
3806f6ba60Sopenharmony_ci{
3906f6ba60Sopenharmony_ci    std::map<std::string, std::string> result;
4006f6ba60Sopenharmony_ci    std::vector<CpuFreqs> cpuFreqInfo = GetCpuFreq();
4106f6ba60Sopenharmony_ci    for (size_t i = 0; i < cpuFreqInfo.size(); i++) {
4206f6ba60Sopenharmony_ci        std::string cpuFreqStr = std::to_string(cpuFreqInfo[i].curFreq);
4306f6ba60Sopenharmony_ci        std::string cpuId = std::to_string(cpuFreqInfo[i].cpuId);
4406f6ba60Sopenharmony_ci        result["cpu" + cpuId + "Frequency"] = cpuFreqStr;
4506f6ba60Sopenharmony_ci    }
4606f6ba60Sopenharmony_ci    std::vector<CpuUsageInfos> workLoads = GetCpuUsage();
4706f6ba60Sopenharmony_ci    const size_t oneHundred = 100;
4806f6ba60Sopenharmony_ci    if (workLoads.empty()) {
4906f6ba60Sopenharmony_ci        return result;
5006f6ba60Sopenharmony_ci    }
5106f6ba60Sopenharmony_ci    for (size_t i = 0; i < workLoads.size(); i++) {
5206f6ba60Sopenharmony_ci        std::string cpuIdStr = workLoads[i].cpuId;
5306f6ba60Sopenharmony_ci        std::string userUsageStr = std::to_string(workLoads[i].userUsage * oneHundred);
5406f6ba60Sopenharmony_ci        std::string niceUsageStr = std::to_string(workLoads[i].niceUsage * oneHundred);
5506f6ba60Sopenharmony_ci        std::string systemUsageStr = std::to_string(workLoads[i].systemUsage * oneHundred);
5606f6ba60Sopenharmony_ci        std::string idleUsageStr = std::to_string(workLoads[i].idleUsage * oneHundred);
5706f6ba60Sopenharmony_ci        std::string ioWaitUsageStr = std::to_string(workLoads[i].ioWaitUsage * oneHundred);
5806f6ba60Sopenharmony_ci        std::string irqUsageStr = std::to_string(workLoads[i].irqUsage * oneHundred);
5906f6ba60Sopenharmony_ci        std::string softIrqUsageStr = std::to_string(workLoads[i].softIrqUsage * oneHundred);
6006f6ba60Sopenharmony_ci        std::string totalUsageStr = std::to_string((workLoads[i].userUsage + workLoads[i].niceUsage +
6106f6ba60Sopenharmony_ci            workLoads[i].systemUsage + workLoads[i].ioWaitUsage + workLoads[i].irqUsage + workLoads[i].softIrqUsage) *
6206f6ba60Sopenharmony_ci            oneHundred);
6306f6ba60Sopenharmony_ci        if (cpuIdStr == cpustr) {
6406f6ba60Sopenharmony_ci            cpuIdStr = totalcpu;
6506f6ba60Sopenharmony_ci        }
6606f6ba60Sopenharmony_ci        result[cpuIdStr + "userUsage"] = userUsageStr;
6706f6ba60Sopenharmony_ci        result[cpuIdStr + "niceUsage"] = niceUsageStr;
6806f6ba60Sopenharmony_ci        result[cpuIdStr + "systemUsage"] = systemUsageStr;
6906f6ba60Sopenharmony_ci        result[cpuIdStr + "idleUsage"] = idleUsageStr;
7006f6ba60Sopenharmony_ci        result[cpuIdStr + "ioWaitUsage"] = ioWaitUsageStr;
7106f6ba60Sopenharmony_ci        result[cpuIdStr + "irqUsage"] = irqUsageStr;
7206f6ba60Sopenharmony_ci        result[cpuIdStr + "softIrqUsage"] = softIrqUsageStr;
7306f6ba60Sopenharmony_ci        result[cpuIdStr + "Usage"] = totalUsageStr;
7406f6ba60Sopenharmony_ci    }
7506f6ba60Sopenharmony_ci    if (!packageName.empty() && !hapFlag) {
7606f6ba60Sopenharmony_ci        std::map<std::string, std::string> processCpuInfo = CPU::GetSysProcessCpuLoad();
7706f6ba60Sopenharmony_ci        if (!processCpuInfo.empty()) {
7806f6ba60Sopenharmony_ci            for (auto it = processCpuInfo.begin(); it != processCpuInfo.end(); ++it) {
7906f6ba60Sopenharmony_ci                result.insert(*it);
8006f6ba60Sopenharmony_ci            }
8106f6ba60Sopenharmony_ci        }
8206f6ba60Sopenharmony_ci    }
8306f6ba60Sopenharmony_ci
8406f6ba60Sopenharmony_ci    LOGI("CPU::ItemData map size(%u)", result.size());
8506f6ba60Sopenharmony_ci    return result;
8606f6ba60Sopenharmony_ci}
8706f6ba60Sopenharmony_ci
8806f6ba60Sopenharmony_civoid CPU::SetPackageName(const std::string &pName)
8906f6ba60Sopenharmony_ci{
9006f6ba60Sopenharmony_ci    packageName = pName;
9106f6ba60Sopenharmony_ci    LOGI("CPU SetPackageName name(%s)", pName.c_str());
9206f6ba60Sopenharmony_ci}
9306f6ba60Sopenharmony_ci
9406f6ba60Sopenharmony_civoid CPU::SetProcessId(const std::string &pid)
9506f6ba60Sopenharmony_ci{
9606f6ba60Sopenharmony_ci    processId = pid;
9706f6ba60Sopenharmony_ci}
9806f6ba60Sopenharmony_ci
9906f6ba60Sopenharmony_cistd::vector<CpuFreqs> CPU::GetCpuFreq()
10006f6ba60Sopenharmony_ci{
10106f6ba60Sopenharmony_ci    OHOS::SmartPerf::CpuFreqs cpuFreqs;
10206f6ba60Sopenharmony_ci    std::vector<CpuFreqs> cpuFrequency;
10306f6ba60Sopenharmony_ci    std::shared_ptr<CpuCollector> collector = CpuCollector::Create();
10406f6ba60Sopenharmony_ci    CollectResult<std::vector<CpuFreq>> result = collector->CollectCpuFrequency();
10506f6ba60Sopenharmony_ci    std::vector<CpuFreq> &cpufreq = result.data;
10606f6ba60Sopenharmony_ci    for (size_t i = 0; i < cpufreq.size(); i++) {
10706f6ba60Sopenharmony_ci        cpuFreqs.cpuId = cpufreq[i].cpuId;
10806f6ba60Sopenharmony_ci        cpuFreqs.curFreq = cpufreq[i].curFreq;
10906f6ba60Sopenharmony_ci        cpuFrequency.push_back(cpuFreqs);
11006f6ba60Sopenharmony_ci        LOGI("cpuFreqs.cpuId: %s", std::to_string(cpufreq[i].cpuId).c_str());
11106f6ba60Sopenharmony_ci        LOGI("cpuFreqs.curFreq: %s", std::to_string(cpufreq[i].curFreq).c_str());
11206f6ba60Sopenharmony_ci    }
11306f6ba60Sopenharmony_ci    return cpuFrequency;
11406f6ba60Sopenharmony_ci}
11506f6ba60Sopenharmony_ci
11606f6ba60Sopenharmony_cistd::vector<CpuUsageInfos> CPU::GetCpuUsage()
11706f6ba60Sopenharmony_ci{
11806f6ba60Sopenharmony_ci    OHOS::SmartPerf::CpuUsageInfos cpuUsageInfos;
11906f6ba60Sopenharmony_ci    std::vector<CpuUsageInfos> workload;
12006f6ba60Sopenharmony_ci    std::shared_ptr<CpuCollector> collector = CpuCollector::Create();
12106f6ba60Sopenharmony_ci    CollectResult<SysCpuUsage> result = collector->CollectSysCpuUsage(true);
12206f6ba60Sopenharmony_ci    SysCpuUsage &sysCpuUsage = result.data;
12306f6ba60Sopenharmony_ci    if (sysCpuUsage.cpuInfos.empty()) {
12406f6ba60Sopenharmony_ci        return workload;
12506f6ba60Sopenharmony_ci    }
12606f6ba60Sopenharmony_ci    for (auto &cpuInfo : sysCpuUsage.cpuInfos) {
12706f6ba60Sopenharmony_ci        cpuUsageInfos.cpuId = cpuInfo.cpuId;
12806f6ba60Sopenharmony_ci        cpuUsageInfos.userUsage = cpuInfo.userUsage;
12906f6ba60Sopenharmony_ci        cpuUsageInfos.niceUsage = cpuInfo.niceUsage;
13006f6ba60Sopenharmony_ci        cpuUsageInfos.systemUsage = cpuInfo.systemUsage;
13106f6ba60Sopenharmony_ci        cpuUsageInfos.idleUsage = cpuInfo.idleUsage;
13206f6ba60Sopenharmony_ci        cpuUsageInfos.ioWaitUsage = cpuInfo.ioWaitUsage;
13306f6ba60Sopenharmony_ci        cpuUsageInfos.irqUsage = cpuInfo.irqUsage;
13406f6ba60Sopenharmony_ci        cpuUsageInfos.softIrqUsage = cpuInfo.softIrqUsage;
13506f6ba60Sopenharmony_ci        workload.push_back(cpuUsageInfos);
13606f6ba60Sopenharmony_ci        LOGI("UsageCpuId: %s", cpuInfo.cpuId.c_str());
13706f6ba60Sopenharmony_ci        LOGI("userUsage: %s", std::to_string(cpuInfo.userUsage).c_str());
13806f6ba60Sopenharmony_ci        LOGI("niceUsage: %s", std::to_string(cpuInfo.niceUsage).c_str());
13906f6ba60Sopenharmony_ci        LOGI("systemUsage: %s", std::to_string(cpuInfo.systemUsage).c_str());
14006f6ba60Sopenharmony_ci        LOGI("idleUsage: %s", std::to_string(cpuInfo.idleUsage).c_str());
14106f6ba60Sopenharmony_ci        LOGI("ioWaitUsage: %s", std::to_string(cpuInfo.ioWaitUsage).c_str());
14206f6ba60Sopenharmony_ci        LOGI("irqUsage: %s", std::to_string(cpuInfo.irqUsage).c_str());
14306f6ba60Sopenharmony_ci        LOGI("softIrqUsage: %s", std::to_string(cpuInfo.softIrqUsage).c_str());
14406f6ba60Sopenharmony_ci    }
14506f6ba60Sopenharmony_ci    return workload;
14606f6ba60Sopenharmony_ci}
14706f6ba60Sopenharmony_ci
14806f6ba60Sopenharmony_cistd::map<std::string, std::string> CPU::GetSysProcessCpuLoad() const
14906f6ba60Sopenharmony_ci{
15006f6ba60Sopenharmony_ci    std::map<std::string, std::string> processCpuInfo;
15106f6ba60Sopenharmony_ci    const size_t oneHundred = 100;
15206f6ba60Sopenharmony_ci    if (!processId.empty()) {
15306f6ba60Sopenharmony_ci        int32_t procId = 0;
15406f6ba60Sopenharmony_ci        procId = std::stoi(processId);
15506f6ba60Sopenharmony_ci        std::shared_ptr<CpuCollector> collector = CpuCollector::Create();
15606f6ba60Sopenharmony_ci        auto collectResult = collector->CollectProcessCpuStatInfo(procId, true);
15706f6ba60Sopenharmony_ci        auto data = collectResult.data;
15806f6ba60Sopenharmony_ci        processCpuInfo["ProcId"] = std::to_string(data.pid);
15906f6ba60Sopenharmony_ci        processCpuInfo["ProcAppName"] = data.procName;
16006f6ba60Sopenharmony_ci        processCpuInfo["ProcCpuLoad"] = std::to_string(data.cpuLoad * oneHundred);
16106f6ba60Sopenharmony_ci        processCpuInfo["ProcCpuUsage"] = std::to_string(data.cpuUsage * oneHundred);
16206f6ba60Sopenharmony_ci        processCpuInfo["ProcUCpuUsage"] = std::to_string(data.uCpuUsage * oneHundred);
16306f6ba60Sopenharmony_ci        processCpuInfo["ProcSCpuUsage"] = std::to_string(data.sCpuUsage * oneHundred);
16406f6ba60Sopenharmony_ci        LOGI("ProcId: %s", std::to_string(data.pid).c_str());
16506f6ba60Sopenharmony_ci        LOGI("ProcAppName: %s", data.procName.c_str());
16606f6ba60Sopenharmony_ci        LOGI("ProcCpuLoad: %s", std::to_string(data.cpuLoad).c_str());
16706f6ba60Sopenharmony_ci        LOGI("ProcCpuUsage: %s", std::to_string(data.cpuUsage).c_str());
16806f6ba60Sopenharmony_ci        LOGI("ProcUCpuUsage: %s", std::to_string(data.uCpuUsage).c_str());
16906f6ba60Sopenharmony_ci        LOGI("ProcSCpuUsage: %s", std::to_string(data.sCpuUsage).c_str());
17006f6ba60Sopenharmony_ci    } else {
17106f6ba60Sopenharmony_ci        processCpuInfo["ProcId"] = "NA";
17206f6ba60Sopenharmony_ci        processCpuInfo["ProcAppName"] = packageName;
17306f6ba60Sopenharmony_ci        processCpuInfo["ProcCpuLoad"] = "NA";
17406f6ba60Sopenharmony_ci        processCpuInfo["ProcCpuUsage"] = "NA";
17506f6ba60Sopenharmony_ci        processCpuInfo["ProcUCpuUsage"] = "NA";
17606f6ba60Sopenharmony_ci        processCpuInfo["ProcSCpuUsage"] = "NA";
17706f6ba60Sopenharmony_ci    }
17806f6ba60Sopenharmony_ci    if (processCpuInfo.find("ProcAppName") != processCpuInfo.end() && processCpuInfo["ProcAppName"].empty()) {
17906f6ba60Sopenharmony_ci        processCpuInfo["ProcId"] = "0";
18006f6ba60Sopenharmony_ci        processCpuInfo["ProcAppName"] = packageName;
18106f6ba60Sopenharmony_ci        processCpuInfo["ProcCpuLoad"] = "0";
18206f6ba60Sopenharmony_ci        processCpuInfo["ProcCpuUsage"] = "0";
18306f6ba60Sopenharmony_ci        processCpuInfo["ProcUCpuUsage"] = "0";
18406f6ba60Sopenharmony_ci        processCpuInfo["ProcSCpuUsage"] = "0";
18506f6ba60Sopenharmony_ci    }
18606f6ba60Sopenharmony_ci    return processCpuInfo;
18706f6ba60Sopenharmony_ci}
18806f6ba60Sopenharmony_civoid CPU::IsFindHap()
18906f6ba60Sopenharmony_ci{
19006f6ba60Sopenharmony_ci    hapFlag = true;
19106f6ba60Sopenharmony_ci}
19206f6ba60Sopenharmony_ci}
19306f6ba60Sopenharmony_ci}
194