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