• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include <iostream>
16 #include <thread>
17 #include <string>
18 #include <climits>
19 #include "include/sp_task.h"
20 #include "include/sp_profiler_factory.h"
21 #include "include/sp_utils.h"
22 #include "include/FPS.h"
23 #include "include/RAM.h"
24 #include "include/CPU.h"
25 #include "include/Capture.h"
26 #include "include/startup_delay.h"
27 #include "include/sp_log.h"
28 #include "ByTrace.h"
29 #include <cstdio>
30 #include <ios>
31 #include <vector>
32 #include <fstream>
33 #include <sstream>
34 #include <regex>
35 #include "unistd.h"
36 #include <future>
37 #include "include/common.h"
38 
39 namespace OHOS {
40 namespace SmartPerf {
41 const long long RM_0 = 0;
42 const long long RM_5000 = 5000;
43 const long long RM_1000 = 1000;
44 const long long RM_1000000 = 1000000;
45 const long long END_WAITING_TIME = 8; // End waiting time,unit seconds
46 // init::-SESSIONID 12345678 -INTERVAL 1000 -PKG ohos.samples.ecg -c -g -t -p -f -r -fl 30
ParseToTask(std::string command,TaskInfo & taskInfo)47 static ExceptionMsg ParseToTask(std::string command, TaskInfo &taskInfo)
48 {
49     std::vector<std::string> args;
50     size_t pos = 0;
51     while ((pos = command.find(" ")) != std::string::npos) {
52         args.push_back(command.substr(0, pos));
53         command.erase(0, pos + 1);
54     }
55     args.push_back(command);
56     StuckNotification snf;
57     snf.isEffective = false;
58     std::string sessionId;
59     long long interval = 1000;
60     std::string pkg;
61     bool isFPS = false;
62     std::vector<std::string> configs;
63     for (size_t i = 0; i < args.size(); i++) {
64         if (args[i] == COMMAND_MAP_REVERSE.at(CommandType::CT_SESSIONID)) {
65             sessionId = args[++i];
66         } else if (args[i] == COMMAND_MAP_REVERSE.at(CommandType::CT_INTERVAL)) {
67             interval = std::stoll(args[++i]);
68         } else if (args[i] == COMMAND_MAP_REVERSE.at(CommandType::CT_PKG)) {
69             pkg = args[++i];
70         } else if (args[i] == COMMAND_MAP_REVERSE.at(CommandType::CT_FL)) { // 获取用户fps的值,并赋给snf.   CT_FL
71             snf.fps = std::stoi(args[++i]);
72             snf.isEffective = true;
73         } else if (args[i] == COMMAND_MAP_REVERSE.at(CommandType::CT_FTL)) { // 获取frameTime的值      CT_FTL
74             snf.frameTime = std::stoi(args[++i]);
75             snf.isEffective = true;
76         } else {
77             if (args[i] == COMMAND_MAP_REVERSE.at(CommandType::CT_F)) { // 判断用户设置是否有-f
78                 isFPS = true;
79             }
80             if (COMMAND_MAP.end() != COMMAND_MAP.find(args[i])) {
81                 configs.push_back(args[i]);
82             }
83         }
84     }
85     if (snf.isEffective && (!isFPS)) {
86         return ExceptionMsg::TASK_CONFIG_NULL;
87     }
88     if (sessionId.empty()) {
89         LOGE("ExceptionMsg ParseToTask sessoin id is null");
90         return ExceptionMsg::SESSION_ID_NULL;
91     } else if (configs.size() == 0) {
92         LOGE("ExceptionMsg ParseToTask configs size is 0");
93         return ExceptionMsg::TASK_CONFIG_NULL;
94     }
95     taskInfo = { sessionId, pkg, configs, interval, snf };
96     return ExceptionMsg::NO_ERR;
97 }
98 
MapToString(std::map<std::string,std::string> myMap)99 static std::string MapToString(std::map<std::string, std::string> myMap)
100 {
101     // 将Map转换为字符串
102     std::string str = "{ ";
103     for (auto it = myMap.begin(); it != myMap.end(); ++it) {
104         str += "\"" + it->first + "\": " + it->second + ", ";
105     }
106     const int subLen = 2;
107     str.erase(str.end() - subLen, str.end());
108     str += " }";
109     return str;
110 }
111 
InitTask(const std::string & recvStr)112 ErrCode SPTask::InitTask(const std::string &recvStr)
113 {
114     LOGI("SPTask::InitTask start param(%s)", recvStr.c_str());
115     std::string result = "";
116     std::string hiprofiler = CMD_COMMAND_MAP.at(CmdCommand::HIPROFILER);
117     SPUtils::LoadCmd(hiprofiler, result);
118     result.clear();
119     std::string perf = CMD_COMMAND_MAP.at(CmdCommand::PERF);
120     SPUtils::LoadCmd(perf, result);
121     std::cout << recvStr << std::endl;
122     ExceptionMsg exMsg = ParseToTask(recvStr, curTaskInfo);
123     if (exMsg == ExceptionMsg::NO_ERR) {
124         isInit = true;
125         LOGI("SPTask::InitTask Ok");
126         return ErrCode::OK;
127     }
128 
129     std::string errInfo = EXCEPTION_MSG_MAP.at(exMsg);
130     LOGI("SPTask::InitTask error(%s)", errInfo.c_str());
131     return ErrCode::FAILED;
132 }
133 
AsyncCollectRam()134 std::future<std::map<std::string, std::string>> SPTask::AsyncCollectRam()
135 {
136     std::promise<std::map<std::string, std::string>> p;
137     std::future<std::map<std::string, std::string>> futureResult;
138     for (std::string ramConfig : curTaskInfo.taskConfig) {
139         if (ramConfig.find("-r") != std::string::npos) {
140             futureResult = p.get_future();
141             std::thread([p = std::move(p)]() mutable {
142                 p.set_value(RAM::GetInstance().ItemData());
143             }).detach();
144         }
145     }
146     return futureResult;
147 }
148 
AsyncCollectCpu()149 std::future<std::map<std::string, std::string>> SPTask::AsyncCollectCpu()
150 {
151     std::promise<std::map<std::string, std::string>> p;
152     std::future<std::map<std::string, std::string>> futureResult;
153     for (std::string cpuConfig : curTaskInfo.taskConfig) {
154         if (cpuConfig.find("-c") != std::string::npos) {
155             futureResult = p.get_future();
156             std::thread([p = std::move(p)]() mutable {
157                 p.set_value(CPU::GetInstance().ItemData());
158             }).detach();
159         }
160     }
161     return futureResult;
162 }
163 
AsyncCollectFps()164 std::future<std::map<std::string, std::string>> SPTask::AsyncCollectFps()
165 {
166     std::promise<std::map<std::string, std::string>> p;
167     std::future<std::map<std::string, std::string>> futureResult;
168     for (std::string fpsConfig : curTaskInfo.taskConfig) {
169         if (fpsConfig.find("-f") != std::string::npos) {
170             futureResult = p.get_future();
171             std::thread([p = std::move(p)]() mutable {
172                 p.set_value(FPS::GetInstance().ItemData());
173             }).detach();
174         }
175     }
176     return futureResult;
177 }
178 
CheckFutureRam(std::future<std::map<std::string,std::string>> & ramResult,std::map<std::string,std::string> & dataMap)179 void SPTask::CheckFutureRam(std::future<std::map<std::string, std::string>> &ramResult,
180     std::map<std::string, std::string> &dataMap)
181 {
182     if (ramResult.valid()) {
183         std::map<std::string, std::string> result = ramResult.get();
184         dataMap.insert(result.begin(), result.end());
185     }
186 }
187 
CheckFutureCpu(std::future<std::map<std::string,std::string>> & cpuResult,std::map<std::string,std::string> & dataMap)188 void SPTask::CheckFutureCpu(std::future<std::map<std::string, std::string>> &cpuResult,
189     std::map<std::string, std::string> &dataMap)
190 {
191     if (cpuResult.valid()) {
192         std::map<std::string, std::string> result = cpuResult.get();
193         dataMap.insert(result.begin(), result.end());
194     }
195 }
196 
CheckFutureFps(std::future<std::map<std::string,std::string>> & fpsResult,std::map<std::string,std::string> & dataMap)197 void SPTask::CheckFutureFps(std::future<std::map<std::string, std::string>> &fpsResult,
198     std::map<std::string, std::string> &dataMap)
199 {
200     if (fpsResult.valid()) {
201         std::map<std::string, std::string> result = fpsResult.get();
202         dataMap.insert(result.begin(), result.end());
203     }
204 }
205 
GetItemData(std::map<std::string,std::string> & dataMap)206 void SPTask::GetItemData(std::map<std::string, std::string> &dataMap)
207 {
208     for (std::string itConfig : curTaskInfo.taskConfig) {
209         if (itConfig.find("-snapshot") != std::string::npos) {
210             Capture::GetInstance().SocketMessage();
211             std::map<std::string, std::string> captureMap = Capture::GetInstance().ItemData();
212             dataMap.insert(captureMap.begin(), captureMap.end());
213         }
214 
215         if (itConfig.find("-gc") != std::string::npos || itConfig.find("-o") != std::string::npos) {
216             continue;
217         }
218 
219         SpProfiler *profiler = SpProfilerFactory::GetCmdProfilerItem(COMMAND_MAP.at(itConfig), false);
220         if (profiler != nullptr) {
221             std::map<std::string, std::string> itemMap = profiler->ItemData();
222             dataMap.insert(itemMap.begin(), itemMap.end());
223         }
224     }
225 }
226 
ConfigDataThread()227 void SPTask::ConfigDataThread()
228 {
229     for (std::string itConfig : curTaskInfo.taskConfig) {
230         if (!sdkData) {
231             ConfigureSdkData(itConfig);
232         }
233 
234         if (itConfig.find("-gc") != std::string::npos) {
235             gpuCounter.StartCollect(GpuCounter::GC_START);
236         }
237     }
238 }
239 
ConfigureSdkData(std::string itConfig)240 void SPTask::ConfigureSdkData(std::string itConfig)
241 {
242     if (itConfig.find("-o") != std::string::npos) {
243         sdkData = true;
244         OHOS::system::SetParameter("debug.smartperf.sdkdataenable", "1");
245         SdkDataRecv &sdkDataRecv = SdkDataRecv::GetInstance();
246         sdkDataRecv.SetRunningState(true);
247         sdk = std::thread([&sdkDataRecv, this]() { this->RunSdkServer(sdkDataRecv); });
248     }
249 }
250 
RunSdkServer(SdkDataRecv & sdkDataRecv)251 void SPTask::RunSdkServer(SdkDataRecv &sdkDataRecv)
252 {
253     sdkDataRecv.ServerThread(sdkvec);
254 }
255 
ResetSdkParam()256 void SPTask::ResetSdkParam()
257 {
258     OHOS::system::SetParameter("debug.smartperf.sdkdataenable", "0");
259     sdkData = false;
260     SdkDataRecv &sdkDataRecv = SdkDataRecv::GetInstance();
261     sdkDataRecv.SetRunningState(false);
262     int listenFd = sdkDataRecv.GetListenFd();
263     if (listenFd != -1) {
264         close(listenFd);
265         sdkDataRecv.SetListenFd(-1);
266     }
267     if (sdk.joinable()) {
268         sdk.join();
269     }
270 };
271 
StopSdkRecv()272 void SPTask::StopSdkRecv()
273 {
274     if (!sdkData || sdkvec.size() <= 0) {
275         return;
276     }
277 
278     std::string outSdkDataDir = baseOutPath + "/" + curTaskInfo.sessionId;
279     char outSdkDataDirChar[PATH_MAX] = {0x00};
280     if (realpath(outSdkDataDir.c_str(), outSdkDataDirChar) == nullptr) {
281         LOGE("data dir %s is nullptr", outSdkDataDir.c_str());
282         return;
283     }
284     std::string outSdkDataPath = std::string(outSdkDataDirChar) + "/sdk_data.csv";
285     sdkDataMtx.lock();
286     std::ofstream outFile;
287     outFile.open(outSdkDataPath.c_str(), std::ios::out | std::ios::trunc);
288     if (!outFile.is_open()) {
289         LOGE("data %s open failed", outSdkDataPath.c_str());
290         return;
291     }
292     std::string title = "source,timestamp,eventName,enable,value\r";
293     outFile << title << std::endl;
294     for (const auto &item : sdkvec) {
295         outFile << item << std::endl;
296     }
297     outFile.close();
298     sdkDataMtx.unlock();
299 }
300 
InitDataFile()301 void SPTask::InitDataFile()
302 {
303     vmap.clear();
304     sdkvec.clear();
305     gpuCounter.GetGpuCounterSaveReportData().clear();
306     SdkDataRecv::GetInstance().SetStartRecordTime();
307     startTime = SPUtils::GetCurTime();
308     std::vector<std::string> files = {
309         "sdk_data.csv",
310         "gpu_counter.csv",
311         "t_general_info.csv",
312         "t_index_info.csv",
313     };
314     std::string fileDir = baseOutPath + "/" + curTaskInfo.sessionId;
315 
316     for (const auto &file: files) {
317         std::string filePath = fileDir + "/" + file;
318         char filePathChar[PATH_MAX] = {0x00};
319         if ((realpath(filePath.c_str(), filePathChar) == nullptr)) {
320             LOGE("%s is not exist, init finish.", filePath.c_str());
321             continue;
322         }
323         std::remove(filePathChar);
324     }
325 }
326 
AsyncGetDataMap(std::function<void (std::string data)> msgTask)327 void SPTask::AsyncGetDataMap(std::function<void(std::string data)> msgTask)
328 {
329     long long lastTime = SPUtils::GetCurTime();
330     asyncDataMtx.lock();
331     std::map<std::string, std::string> dataMap;
332     if (!curTaskInfo.packageName.empty()) {
333         std::string processId = "";
334         OHOS::SmartPerf::StartUpDelay sp;
335         processId = sp.GetPidByPkg(curTaskInfo.packageName);
336         SpProfilerFactory::SetProfilerPidByPkg(processId);
337     }
338     dataMap.insert(std::pair<std::string, std::string>(std::string("timestamp"), std::to_string(lastTime)));
339     std::future<std::map<std::string, std::string>> fpsResult = AsyncCollectFps();
340     std::future<std::map<std::string, std::string>> cpuResult = AsyncCollectCpu();
341     GetItemData(dataMap);
342     std::future<std::map<std::string, std::string>> ramResult = AsyncCollectRam();
343     CheckFutureFps(fpsResult, dataMap);
344     CheckFutureCpu(cpuResult, dataMap);
345     CheckFutureRam(ramResult, dataMap);
346     if (curTaskInfo.stuckInfo.isEffective) {
347         std::map<std::string, std::string> timeUsedMap = DetectionAndGrab();
348         if (!timeUsedMap.empty()) {
349             dataMap.insert(timeUsedMap.begin(), timeUsedMap.end());
350         }
351     }
352     SPData spdata;
353     spdata.values.insert(dataMap.begin(), dataMap.end());
354     if (GetRecordState()) {
355         vmap.push_back(spdata);
356     }
357     gpuCounter.GetGpuRealtimeData(dataMap);
358     SdkDataRecv::GetInstance().GetSdkDataRealtimeData(dataMap);
359     msgTask(MapToString(dataMap));
360     long long nextTime = SPUtils::GetCurTime();
361     long long costTime = nextTime - lastTime;
362     long long pTime = 998;
363     if (costTime < curTaskInfo.freq) {
364         std::this_thread::sleep_for(std::chrono::milliseconds(pTime - costTime));
365     }
366     asyncDataMtx.unlock();
367 }
368 
StartTask(std::function<void (std::string data)> msgTask)369 ErrCode SPTask::StartTask(std::function<void(std::string data)> msgTask)
370 {
371     LOGI("SPTask::StartTask start ");
372     RAM &ram = RAM::GetInstance();
373     ram.SetFirstFlag();
374     if (!isInit) {
375         LOGW("SPTask::StartTask initialization failed");
376         return ErrCode::FAILED;
377     }
378     isRunning = true;
379     realTimeStart = SPUtils::GetCurTime();
380     if (!curTaskInfo.packageName.empty()) {
381         SpProfilerFactory::SetProfilerPkg(curTaskInfo.packageName);
382     }
383     InitDataFile();
384     ConfigDataThread();
385     thread = std::thread([this, msgTask]() {
386         while (isRunning) {
387             AsyncGetDataMap(msgTask);
388         }
389     });
390     LOGI("SPTask::StartTask complete");
391     return ErrCode::OK;
392 }
393 
WritePath(std::string thisBasePath)394 void SPTask::WritePath(std::string thisBasePath)
395 {
396     if (!SPUtils::FileAccess(thisBasePath)) {
397         std::string cmdResult;
398         std::string writePath = CMD_COMMAND_MAP.at(CmdCommand::WRITE_PATH) + curTaskInfo.sessionId;
399         SPUtils::LoadCmd(writePath, cmdResult);
400     }
401 }
402 
StopGetInfo()403 void SPTask::StopGetInfo()
404 {
405     bool isTcpMessage = true;
406     std::string thisBasePath = baseOutPath + "/" + curTaskInfo.sessionId;
407     WritePath(thisBasePath);
408     std::string outIndexpath = thisBasePath + "/t_index_info.csv";
409     long long endTime = SPUtils::GetCurTime();
410     long long testDuration = (endTime - startTime) / 1000;
411     const std::string gpuDataVersion = "1.1";
412     std::string screenStr = SPUtils::GetScreen();
413     size_t pos3 = screenStr.find("=");
414     std::string refreshrate = screenStr.substr(pos3 + 1);
415     std::map<std::string, std::string> taskInfoMap = {
416         { "sessionId", curTaskInfo.sessionId },
417         { "taskId", curTaskInfo.sessionId },
418         { "appName", curTaskInfo.packageName },
419         { "packageName", curTaskInfo.packageName },
420         { "startTime", std::to_string(startTime) },
421         { "endTime", std::to_string(endTime) },
422         { "testDuration", std::to_string(testDuration) },
423         { "taskName", "testtask" },
424         { "board", "hw" },
425         { "target_fps", refreshrate },
426         { "gpuDataVersion", gpuDataVersion },
427     };
428     std::map<std::string, std::string> deviceInfo = SPUtils::GetDeviceInfo();
429     std::map<std::string, std::string> cpuInfo = SPUtils::GetCpuInfo(isTcpMessage);
430     std::map<std::string, std::string> gpuInfo = SPUtils::GetGpuInfo(isTcpMessage);
431     std::map<std::string, std::string> destMap;
432     destMap.insert(taskInfoMap.begin(), taskInfoMap.end());
433     destMap.insert(deviceInfo.begin(), deviceInfo.end());
434     destMap.insert(cpuInfo.begin(), cpuInfo.end());
435     destMap.insert(gpuInfo.begin(), gpuInfo.end());
436     OHOS::SmartPerf::SpCsvUtil::WriteCsvH(destMap);
437     if (!vmap.empty()) {
438         vmap.erase(vmap.begin());
439     }
440     OHOS::SmartPerf::SpCsvUtil::WriteCsv(outIndexpath, vmap);
441 }
StopGpuCounterRecv()442 void SPTask::StopGpuCounterRecv()
443 {
444     std::string outGpuCounterDataPath = baseOutPath + "/" + curTaskInfo.sessionId;
445 
446     if (GetRecordState()) {
447         gpuCounter.GetInstance().SaveData(outGpuCounterDataPath);
448     }
449 }
StopTask()450 void SPTask::StopTask()
451 {
452     LOGI("SPTask::StopTask start");
453 
454     if (GetRecordState()) {
455         StopGetInfo();
456         StopSdkRecv();
457         StopGpuCounterRecv();
458 
459         vmap.clear();
460         sdkvec.clear();
461         gpuCounter.GetGpuCounterData().clear();
462         recordState = false;
463     }
464 
465     ResetSdkParam();
466     gpuCounter.StopCollect();
467 
468     isRunning = false;
469     isInit = false;
470     realTimeStart = 0;
471 
472     if (thread.joinable()) {
473         thread.join();
474     }
475 
476     KillHiperfCmd();
477 
478     LOGI("SPTask::StopTask complete");
479 }
480 
DetectionAndGrab()481 std::map<std::string, std::string> SPTask::DetectionAndGrab()
482 {
483     std::map<std::string, std::string> templateMap;
484     if (!curTaskInfo.stuckInfo.isEffective) {
485         return templateMap;
486     }
487 
488     FpsCurrentFpsTime fcf = FPS::GetInstance().GetFpsCurrentFpsTime();
489     long long nowTime = SPUtils::GetCurTime();
490     long long curframeTime = fcf.currentFpsTime / RM_1000000; // Convert to milliseconds
491     std::cout << "start::" << startCaptuerTime << std::endl;
492 
493     if (startCaptuerTime > 0) {
494         long long diff =
495             startCaptuerTime > nowTime ? (LLONG_MAX - startCaptuerTime + nowTime) : (nowTime - startCaptuerTime);
496         if (diff > RM_5000 && (!CheckCounterId())) {
497             startCaptuerTime = RM_0;
498         }
499     }
500 
501     if (curTaskInfo.stuckInfo.fps > fcf.fps || curTaskInfo.stuckInfo.frameTime < curframeTime) {
502         if (startCaptuerTime == 0) {
503             startCaptuerTime = nowTime;
504             std::cout << "ThreadGetHiperf::" << startCaptuerTime << std::endl;
505             ThreadGetHiperf(startCaptuerTime);
506         }
507     }
508     templateMap["fpsWarn"] = std::to_string(fcf.fps);
509     templateMap["FrameTimeWarn"] = std::to_string(fcf.currentFpsTime);
510     templateMap["TraceTime"] = std::to_string(startCaptuerTime);
511     return templateMap;
512 }
513 
CheckCounterId()514 bool SPTask::CheckCounterId()
515 {
516     std::string result;
517     std::string hiprofilerCmd = CMD_COMMAND_MAP.at(CmdCommand::HIPROFILER_CMD);
518     SPUtils::LoadCmd(hiprofilerCmd, result);
519     if (result.empty()) {
520         return false;
521     }
522 
523     if (result.find("-k") != std::string::npos) {
524         return true;
525     }
526 
527     return false;
528 }
ThreadGetHiperf(long long timeStamp)529 std::thread SPTask::ThreadGetHiperf(long long timeStamp)
530 {
531     auto thGetTrace = [this, timeStamp]() { this->GetHiperf(std::to_string(timeStamp)); };
532     std::thread spThread(thGetTrace);
533     spThread.detach();
534     return spThread;
535 }
536 
GetHiperf(const std::string & traceName)537 void SPTask::GetHiperf(const std::string &traceName)
538 {
539     std::string result;
540     std::string tmp = SetHiperf(traceName);
541     std::cout << tmp << std::endl;
542     LOGD("hiprofiler exec (%s)", tmp.c_str());
543     LOGI("hiprofiler exec trace name(%s)", traceName.c_str());
544     SPUtils::LoadCmd(tmp, result);
545     LOGI("hiprofiler exec end (%s)", result.c_str());
546 }
547 
548 
CheckTcpParam(std::string str,std::string & errorInfo)549 bool SPTask::CheckTcpParam(std::string str, std::string &errorInfo)
550 {
551     std::set<std::string> keys;
552     for (auto a : COMMAND_MAP) {
553         keys.insert(a.first.substr(1)); // 不需要前面的'-'
554     }
555 
556     return SPUtils::VeriyParameter(keys, str, errorInfo);
557 }
558 
KillHiperfCmd()559 void SPTask::KillHiperfCmd()
560 {
561     long long now = 0;
562     long long runTime = 0;
563     std::string killCmd = CMD_COMMAND_MAP.at(CmdCommand::KILL_CMD) + "-9 ";
564     std::string result;
565     std::vector<std::string> out;
566 
567     if (startCaptuerTime <= 0) {
568         return;
569     }
570 
571     now = SPUtils::GetCurTime();
572     runTime = now > startCaptuerTime ? now - startCaptuerTime : LLONG_MAX - startCaptuerTime + now;
573     runTime = runTime / RM_1000; // Convert to seconds
574 
575     LOGI("Preparing to exit run time(%lld)", runTime);
576     do {
577         out.clear();
578         std::string hiprofilerPid = CMD_COMMAND_MAP.at(CmdCommand::HIPROFILER_PID);
579         SPUtils::LoadCmd(hiprofilerPid, result);
580         SPUtils::StrSplit(result, " ", out);
581         if (out.empty()) {
582             break;
583         }
584 
585         sleep(1);
586     } while (END_WAITING_TIME - runTime++ > 0);
587 
588     out.clear();
589     std::string hiprofilerPid = CMD_COMMAND_MAP.at(CmdCommand::HIPROFILER_PID);
590     SPUtils::LoadCmd(hiprofilerPid, result);
591     SPUtils::StrSplit(result, " ", out);
592     LOGI("pidof hiprofiler_cmd size(%u)", out.size());
593     for (auto it = out.begin(); out.end() != it; ++it) {
594         result.clear();
595         SPUtils::LoadCmd(killCmd + (*it), result);
596     }
597 
598     return;
599 }
600 
SetHiperf(const std::string & traceName)601 std::string SPTask::SetHiperf(const std::string &traceName)
602 {
603     std::string hiPrefix = "hiprofiler_";
604     std::string dataPrefix = "perf_";
605     requestId++;
606     std::string trtmp = strOne + hiPrefix + traceName + strTwo + "\n" + strThree + std::to_string(requestId) + "\n" +
607         strFour + "\n" + strFive + hiPrefix + traceName + strSix + "\n" + strNine + strEleven + "\n" + strSeven +
608         dataPrefix + traceName + strEight + strTen + "\n" + conFig;
609     return trtmp;
610 }
611 
GetRecordState()612 bool SPTask::GetRecordState()
613 {
614     return recordState;
615 }
StartRecord()616 void SPTask::StartRecord()
617 {
618     LOGI("SPTask::StartRecord");
619     startTime = SPUtils::GetCurTime();
620     InitDataFile();
621     recordState = true;
622 }
623 
StopRecord()624 void SPTask::StopRecord()
625 {
626     LOGI("SPTask::StopRecord");
627     std::string outGpuCounterDataPath = baseOutPath + "/" + curTaskInfo.sessionId;
628 
629     if (isInit) {
630         StopGetInfo();
631         if (sdkData) {
632             StopSdkRecv();
633         }
634         gpuCounter.GetInstance().SaveData(outGpuCounterDataPath);
635     }
636 
637     vmap.clear();
638     sdkvec.clear();
639     gpuCounter.GetGpuCounterData().clear();
640 
641     recordState = false;
642 }
643 
GetRealStartTime() const644 time_t SPTask::GetRealStartTime() const
645 {
646     return realTimeStart;
647 }
648 }
649 }
650