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