1 /*
2  * Copyright (C) 2021 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 #ifndef SP_TASK_H
16 #define SP_TASK_H
17 #include <iostream>
18 #include <functional>
19 #include <vector>
20 #include <thread>
21 #include <future>
22 #include <map>
23 #include <mutex>
24 #include <climits>
25 #include "parameters.h"
26 #include "sp_csv_util.h"
27 #include "sdk_data_recv.h"
28 #include "GpuCounter.h"
29 namespace OHOS {
30 namespace SmartPerf {
31 enum class ExceptionMsg {
32     NO_ERR,
33     SESSION_ID_NULL,
34     TASK_CONFIG_NULL,
35     PACKAGE_NULL,
36 };
37 
38 const std::map<ExceptionMsg, std::string> EXCEPTION_MSG_MAP = {
39     { ExceptionMsg::NO_ERR, "NoErr" },
40     { ExceptionMsg::SESSION_ID_NULL, "SessionIdNull" },
41     { ExceptionMsg::TASK_CONFIG_NULL, "TaskConfigNull" },
42     { ExceptionMsg::PACKAGE_NULL, "PackageNull" },
43 };
44 
45 enum class ErrCode {
46     OK,
47     FAILED,
48 };
49 struct StuckNotification {
50     bool isEffective = false;
51     int fps = 0;
52     long long frameTime = LLONG_MAX;
53 };
54 struct TaskInfo {
55     std::string sessionId = "";
56     std::string packageName = "";
57     std::vector<std::string> taskConfig = {};
58     long long freq = 0;
59     StuckNotification stuckInfo;
60 };
61 
62 class SPTask {
63 public:
GetInstance()64     static SPTask &GetInstance()
65     {
66         static SPTask instance;
67         return instance;
68     }
69     ErrCode InitTask(const std::string &recvStr);
70     ErrCode StartTask(std::function<void(std::string data)> msgTask);
71     void StopTask();
72     std::string GetCurrentTimeAsString();
73     std::map<std::string, std::string> DetectionAndGrab();
74     bool CheckTcpParam(std::string str, std::string &errorInfo);
75     std::future<std::map<std::string, std::string>> AsyncCollectRam();
76     std::future<std::map<std::string, std::string>> AsyncCollectFps();
77     std::future<std::map<std::string, std::string>> AsyncCollectCpu();
78     void CheckFutureRam(std::future<std::map<std::string, std::string>> &ramResult,
79         std::map<std::string, std::string> &dataMap);
80     void CheckFutureFps(std::future<std::map<std::string, std::string>> &fpsResult,
81         std::map<std::string, std::string> &dataMap);
82     void CheckFutureCpu(std::future<std::map<std::string, std::string>> &cpuResult,
83         std::map<std::string, std::string> &dataMap);
84     void GetItemData(std::map<std::string, std::string> &dataMap);
85     void GetGpuRealtimeData(std::map<std::string, std::string> &dataMap);
86     void WritePath(std::string thisBasePath);
87     void ConfigDataThread();
88     void StopSdkRecv();
89     void StopGpuCounterRecv();
90     void InitDataFile();
91     void AsyncGetDataMap(std::function<void(std::string data)> msgTask);
92     void StopGetInfo();
93     void StartRecord();
94     void StopRecord();
95     bool GetRecordState();
96     time_t GetRealStartTime() const;
97 
98 private:
99     std::thread ThreadGetHiperf(long long timeStamp);
100     void GetHiperf(const std::string &traceName);
101     std::string SetHiperf(const std::string &traceName);
102     bool CheckCounterId();
103     void KillHiperfCmd();
104     void ConfigureSdkData(std::string itConfig);
105     void RunSdkServer(SdkDataRecv &sdkDataRecv);
106     void ResetSdkParam();
107 
108 private:
109     TaskInfo curTaskInfo;
110     long long startTime = 0;
111     std::thread thread;
112     std::vector<SPData> vmap;
113     bool isRunning = false;
114     bool isInit = false;
115     std::mutex asyncDataMtx;
116     std::mutex sdkDataMtx;
117     const std::string baseOutPath = "/data/local/tmp/smartperf";
118     long long startCaptuerTime = 0;
119     int requestId = 1;
120     bool sdkData = false;
121     std::thread sdk;
122     std::vector<std::string> sdkvec;
123     GpuCounter &gpuCounter = GpuCounter::GetInstance();
124     bool recordState = false;
125     time_t realTimeStart = 0;
126 
127     std::string strOne = R"(hiprofiler_cmd \
128   -c - \
129   -o /data/local/tmp/)";
130     std::string strTwo = R"(.htrace \
131   -t 5 \
132   -s \
133   -k \
134 <<CONFIG)";
135 
136     std::string strThree = R"(request_id: )";
137     std::string strFour = R"( session_config {
138     buffers {
139     pages: 16384
140     })";
141     std::string strFive = R"( result_file: "/data/local/tmp/)";
142     std::string strSix = R"(.htrace"
143     sample_duration: 5000
144     })";
145     std::string strNine = R"( plugin_configs {
146   plugin_name: "ftrace-plugin"
147   sample_interval: 1000
148   config_data {
149     ftrace_events: "sched/sched_switch"
150     ftrace_events: "power/suspend_resume"
151     ftrace_events: "sched/sched_wakeup"
152     ftrace_events: "sched/sched_wakeup_new"
153     ftrace_events: "sched/sched_waking"
154     ftrace_events: "sched/sched_process_exit"
155     ftrace_events: "sched/sched_process_free"
156     ftrace_events: "task/task_newtask"
157     ftrace_events: "task/task_rename"
158     ftrace_events: "power/cpu_frequency"
159     ftrace_events: "power/cpu_idle"
160     hitrace_categories: "ace"
161     hitrace_categories: "app"
162     hitrace_categories: "ark"
163     hitrace_categories: "graphic"
164     hitrace_categories: "ohos"
165     hitrace_categories: "bin)";
166     std::string strEleven = R"(der"
167     hitrace_categories: "irq"
168     hitrace_categories: "pagecache"
169     hitrace_categories: "zaudio"
170     buffer_size_kb: 20480
171     flush_interval_ms: 1000
172     flush_threshold_kb: 4096
173     parse_ksyms: true
174     clock: "boot"
175     trace_period_ms: 200
176     debug_on: false
177     hitrace_time: 5
178     }
179     })";
180     std::string strSeven = R"( plugin_configs {
181   plugin_name: "hiperf-plugin"
182   sample_interval: 5000
183   config_data {
184     is_root: false
185    outfile_name: "/data/local/tmp/)";
186     std::string strEight = R"(.data"
187    record_args: "-f 1000 -a  --cpu-limit 100 -e hw-cpu-cycles,sched:sched_waking )";
188     std::string strTen = R"(--call-stack dwarf --clockid monotonic --offcpu -m 256"
189     }
190     })";
191     std::string conFig = R"(CONFIG)";
192 };
193 }
194 }
195 
196 #endif