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#ifndef SP_TASK_H
1606f6ba60Sopenharmony_ci#define SP_TASK_H
1706f6ba60Sopenharmony_ci#include <iostream>
1806f6ba60Sopenharmony_ci#include <functional>
1906f6ba60Sopenharmony_ci#include <vector>
2006f6ba60Sopenharmony_ci#include <thread>
2106f6ba60Sopenharmony_ci#include <future>
2206f6ba60Sopenharmony_ci#include <map>
2306f6ba60Sopenharmony_ci#include <mutex>
2406f6ba60Sopenharmony_ci#include <climits>
2506f6ba60Sopenharmony_ci#include "parameters.h"
2606f6ba60Sopenharmony_ci#include "sp_csv_util.h"
2706f6ba60Sopenharmony_ci#include "sdk_data_recv.h"
2806f6ba60Sopenharmony_ci#include "GpuCounter.h"
2906f6ba60Sopenharmony_cinamespace OHOS {
3006f6ba60Sopenharmony_cinamespace SmartPerf {
3106f6ba60Sopenharmony_cienum class ExceptionMsg {
3206f6ba60Sopenharmony_ci    NO_ERR,
3306f6ba60Sopenharmony_ci    SESSION_ID_NULL,
3406f6ba60Sopenharmony_ci    TASK_CONFIG_NULL,
3506f6ba60Sopenharmony_ci    PACKAGE_NULL,
3606f6ba60Sopenharmony_ci};
3706f6ba60Sopenharmony_ci
3806f6ba60Sopenharmony_ciconst std::map<ExceptionMsg, std::string> EXCEPTION_MSG_MAP = {
3906f6ba60Sopenharmony_ci    { ExceptionMsg::NO_ERR, "NoErr" },
4006f6ba60Sopenharmony_ci    { ExceptionMsg::SESSION_ID_NULL, "SessionIdNull" },
4106f6ba60Sopenharmony_ci    { ExceptionMsg::TASK_CONFIG_NULL, "TaskConfigNull" },
4206f6ba60Sopenharmony_ci    { ExceptionMsg::PACKAGE_NULL, "PackageNull" },
4306f6ba60Sopenharmony_ci};
4406f6ba60Sopenharmony_ci
4506f6ba60Sopenharmony_cienum class ErrCode {
4606f6ba60Sopenharmony_ci    OK,
4706f6ba60Sopenharmony_ci    FAILED,
4806f6ba60Sopenharmony_ci};
4906f6ba60Sopenharmony_cistruct StuckNotification {
5006f6ba60Sopenharmony_ci    bool isEffective = false;
5106f6ba60Sopenharmony_ci    int fps = 0;
5206f6ba60Sopenharmony_ci    long long frameTime = LLONG_MAX;
5306f6ba60Sopenharmony_ci};
5406f6ba60Sopenharmony_cistruct TaskInfo {
5506f6ba60Sopenharmony_ci    std::string sessionId = "";
5606f6ba60Sopenharmony_ci    std::string packageName = "";
5706f6ba60Sopenharmony_ci    std::vector<std::string> taskConfig = {};
5806f6ba60Sopenharmony_ci    long long freq = 0;
5906f6ba60Sopenharmony_ci    StuckNotification stuckInfo;
6006f6ba60Sopenharmony_ci};
6106f6ba60Sopenharmony_ci
6206f6ba60Sopenharmony_ciclass SPTask {
6306f6ba60Sopenharmony_cipublic:
6406f6ba60Sopenharmony_ci    static SPTask &GetInstance()
6506f6ba60Sopenharmony_ci    {
6606f6ba60Sopenharmony_ci        static SPTask instance;
6706f6ba60Sopenharmony_ci        return instance;
6806f6ba60Sopenharmony_ci    }
6906f6ba60Sopenharmony_ci    ErrCode InitTask(const std::string &recvStr);
7006f6ba60Sopenharmony_ci    ErrCode StartTask(std::function<void(std::string data)> msgTask);
7106f6ba60Sopenharmony_ci    void StopTask();
7206f6ba60Sopenharmony_ci    std::string GetCurrentTimeAsString();
7306f6ba60Sopenharmony_ci    std::map<std::string, std::string> DetectionAndGrab();
7406f6ba60Sopenharmony_ci    bool CheckTcpParam(std::string str, std::string &errorInfo);
7506f6ba60Sopenharmony_ci    std::future<std::map<std::string, std::string>> AsyncCollectRam();
7606f6ba60Sopenharmony_ci    std::future<std::map<std::string, std::string>> AsyncCollectFps();
7706f6ba60Sopenharmony_ci    std::future<std::map<std::string, std::string>> AsyncCollectCpu();
7806f6ba60Sopenharmony_ci    void CheckFutureRam(std::future<std::map<std::string, std::string>> &ramResult,
7906f6ba60Sopenharmony_ci        std::map<std::string, std::string> &dataMap);
8006f6ba60Sopenharmony_ci    void CheckFutureFps(std::future<std::map<std::string, std::string>> &fpsResult,
8106f6ba60Sopenharmony_ci        std::map<std::string, std::string> &dataMap);
8206f6ba60Sopenharmony_ci    void CheckFutureCpu(std::future<std::map<std::string, std::string>> &cpuResult,
8306f6ba60Sopenharmony_ci        std::map<std::string, std::string> &dataMap);
8406f6ba60Sopenharmony_ci    void GetItemData(std::map<std::string, std::string> &dataMap);
8506f6ba60Sopenharmony_ci    void GetGpuRealtimeData(std::map<std::string, std::string> &dataMap);
8606f6ba60Sopenharmony_ci    void WritePath(std::string thisBasePath);
8706f6ba60Sopenharmony_ci    void ConfigDataThread();
8806f6ba60Sopenharmony_ci    void StopSdkRecv();
8906f6ba60Sopenharmony_ci    void StopGpuCounterRecv();
9006f6ba60Sopenharmony_ci    void InitDataFile();
9106f6ba60Sopenharmony_ci    void AsyncGetDataMap(std::function<void(std::string data)> msgTask);
9206f6ba60Sopenharmony_ci    void StopGetInfo();
9306f6ba60Sopenharmony_ci    void StartRecord();
9406f6ba60Sopenharmony_ci    void StopRecord();
9506f6ba60Sopenharmony_ci    bool GetRecordState();
9606f6ba60Sopenharmony_ci    time_t GetRealStartTime() const;
9706f6ba60Sopenharmony_ci
9806f6ba60Sopenharmony_ciprivate:
9906f6ba60Sopenharmony_ci    std::thread ThreadGetHiperf(long long timeStamp);
10006f6ba60Sopenharmony_ci    void GetHiperf(const std::string &traceName);
10106f6ba60Sopenharmony_ci    std::string SetHiperf(const std::string &traceName);
10206f6ba60Sopenharmony_ci    bool CheckCounterId();
10306f6ba60Sopenharmony_ci    void KillHiperfCmd();
10406f6ba60Sopenharmony_ci    void ConfigureSdkData(std::string itConfig);
10506f6ba60Sopenharmony_ci    void RunSdkServer(SdkDataRecv &sdkDataRecv);
10606f6ba60Sopenharmony_ci    void ResetSdkParam();
10706f6ba60Sopenharmony_ci
10806f6ba60Sopenharmony_ciprivate:
10906f6ba60Sopenharmony_ci    TaskInfo curTaskInfo;
11006f6ba60Sopenharmony_ci    long long startTime = 0;
11106f6ba60Sopenharmony_ci    std::thread thread;
11206f6ba60Sopenharmony_ci    std::vector<SPData> vmap;
11306f6ba60Sopenharmony_ci    bool isRunning = false;
11406f6ba60Sopenharmony_ci    bool isInit = false;
11506f6ba60Sopenharmony_ci    std::mutex asyncDataMtx;
11606f6ba60Sopenharmony_ci    std::mutex sdkDataMtx;
11706f6ba60Sopenharmony_ci    const std::string baseOutPath = "/data/local/tmp/smartperf";
11806f6ba60Sopenharmony_ci    long long startCaptuerTime = 0;
11906f6ba60Sopenharmony_ci    int requestId = 1;
12006f6ba60Sopenharmony_ci    bool sdkData = false;
12106f6ba60Sopenharmony_ci    std::thread sdk;
12206f6ba60Sopenharmony_ci    std::vector<std::string> sdkvec;
12306f6ba60Sopenharmony_ci    GpuCounter &gpuCounter = GpuCounter::GetInstance();
12406f6ba60Sopenharmony_ci    bool recordState = false;
12506f6ba60Sopenharmony_ci    time_t realTimeStart = 0;
12606f6ba60Sopenharmony_ci
12706f6ba60Sopenharmony_ci    std::string strOne = R"(hiprofiler_cmd \
12806f6ba60Sopenharmony_ci  -c - \
12906f6ba60Sopenharmony_ci  -o /data/local/tmp/)";
13006f6ba60Sopenharmony_ci    std::string strTwo = R"(.htrace \
13106f6ba60Sopenharmony_ci  -t 5 \
13206f6ba60Sopenharmony_ci  -s \
13306f6ba60Sopenharmony_ci  -k \
13406f6ba60Sopenharmony_ci<<CONFIG)";
13506f6ba60Sopenharmony_ci
13606f6ba60Sopenharmony_ci    std::string strThree = R"(request_id: )";
13706f6ba60Sopenharmony_ci    std::string strFour = R"( session_config {
13806f6ba60Sopenharmony_ci    buffers {
13906f6ba60Sopenharmony_ci    pages: 16384
14006f6ba60Sopenharmony_ci    })";
14106f6ba60Sopenharmony_ci    std::string strFive = R"( result_file: "/data/local/tmp/)";
14206f6ba60Sopenharmony_ci    std::string strSix = R"(.htrace"
14306f6ba60Sopenharmony_ci    sample_duration: 5000
14406f6ba60Sopenharmony_ci    })";
14506f6ba60Sopenharmony_ci    std::string strNine = R"( plugin_configs {
14606f6ba60Sopenharmony_ci  plugin_name: "ftrace-plugin"
14706f6ba60Sopenharmony_ci  sample_interval: 1000
14806f6ba60Sopenharmony_ci  config_data {
14906f6ba60Sopenharmony_ci    ftrace_events: "sched/sched_switch"
15006f6ba60Sopenharmony_ci    ftrace_events: "power/suspend_resume"
15106f6ba60Sopenharmony_ci    ftrace_events: "sched/sched_wakeup"
15206f6ba60Sopenharmony_ci    ftrace_events: "sched/sched_wakeup_new"
15306f6ba60Sopenharmony_ci    ftrace_events: "sched/sched_waking"
15406f6ba60Sopenharmony_ci    ftrace_events: "sched/sched_process_exit"
15506f6ba60Sopenharmony_ci    ftrace_events: "sched/sched_process_free"
15606f6ba60Sopenharmony_ci    ftrace_events: "task/task_newtask"
15706f6ba60Sopenharmony_ci    ftrace_events: "task/task_rename"
15806f6ba60Sopenharmony_ci    ftrace_events: "power/cpu_frequency"
15906f6ba60Sopenharmony_ci    ftrace_events: "power/cpu_idle"
16006f6ba60Sopenharmony_ci    hitrace_categories: "ace"
16106f6ba60Sopenharmony_ci    hitrace_categories: "app"
16206f6ba60Sopenharmony_ci    hitrace_categories: "ark"
16306f6ba60Sopenharmony_ci    hitrace_categories: "graphic"
16406f6ba60Sopenharmony_ci    hitrace_categories: "ohos"
16506f6ba60Sopenharmony_ci    hitrace_categories: "bin)";
16606f6ba60Sopenharmony_ci    std::string strEleven = R"(der"
16706f6ba60Sopenharmony_ci    hitrace_categories: "irq"
16806f6ba60Sopenharmony_ci    hitrace_categories: "pagecache"
16906f6ba60Sopenharmony_ci    hitrace_categories: "zaudio"
17006f6ba60Sopenharmony_ci    buffer_size_kb: 20480
17106f6ba60Sopenharmony_ci    flush_interval_ms: 1000
17206f6ba60Sopenharmony_ci    flush_threshold_kb: 4096
17306f6ba60Sopenharmony_ci    parse_ksyms: true
17406f6ba60Sopenharmony_ci    clock: "boot"
17506f6ba60Sopenharmony_ci    trace_period_ms: 200
17606f6ba60Sopenharmony_ci    debug_on: false
17706f6ba60Sopenharmony_ci    hitrace_time: 5
17806f6ba60Sopenharmony_ci    }
17906f6ba60Sopenharmony_ci    })";
18006f6ba60Sopenharmony_ci    std::string strSeven = R"( plugin_configs {
18106f6ba60Sopenharmony_ci  plugin_name: "hiperf-plugin"
18206f6ba60Sopenharmony_ci  sample_interval: 5000
18306f6ba60Sopenharmony_ci  config_data {
18406f6ba60Sopenharmony_ci    is_root: false
18506f6ba60Sopenharmony_ci   outfile_name: "/data/local/tmp/)";
18606f6ba60Sopenharmony_ci    std::string strEight = R"(.data"
18706f6ba60Sopenharmony_ci   record_args: "-f 1000 -a  --cpu-limit 100 -e hw-cpu-cycles,sched:sched_waking )";
18806f6ba60Sopenharmony_ci    std::string strTen = R"(--call-stack dwarf --clockid monotonic --offcpu -m 256"
18906f6ba60Sopenharmony_ci    }
19006f6ba60Sopenharmony_ci    })";
19106f6ba60Sopenharmony_ci    std::string conFig = R"(CONFIG)";
19206f6ba60Sopenharmony_ci};
19306f6ba60Sopenharmony_ci}
19406f6ba60Sopenharmony_ci}
19506f6ba60Sopenharmony_ci
19606f6ba60Sopenharmony_ci#endif