1 /* 2 * Copyright (c) Huawei Technologies Co., Ltd. 2024. All rights reserved. 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 16 #include <thread> 17 #include <iostream> 18 #include <chrono> 19 #include <cstdlib> 20 #include <unistd.h> 21 #include <mutex> 22 #include "include/heartbeat.h" 23 #include "include/sp_utils.h" 24 #include "sp_log.h" 25 #include "include/startup_delay.h" 26 #include "include/common.h" 27 namespace OHOS { 28 namespace SmartPerf { KillSpId()29void Heartbeat::KillSpId() 30 { 31 std::string str; 32 std::string resultPid; 33 std::string cmd = CMD_COMMAND_MAP.at(CmdCommand::PIDOF_SP); 34 SPUtils::LoadCmd(cmd, resultPid); 35 std::vector<std::string> vec; 36 std::string token; 37 size_t pos = resultPid.find(' '); 38 do { 39 token = resultPid.substr(0, pos); 40 vec.push_back(token); 41 resultPid.erase(0, pos + 1); 42 } while ((pos = resultPid.find(' ')) != std::string::npos); 43 if (vec.size() > 0) { 44 std::string killCmd = CMD_COMMAND_MAP.at(CmdCommand::KILL_CMD); 45 for (size_t i = 0; i < vec.size(); i++) { 46 SPUtils::LoadCmd(killCmd + vec[i], str); 47 } 48 } 49 } 50 HeartbeatRule()51void Heartbeat::HeartbeatRule() 52 { 53 while (isrunning) { 54 auto end = std::chrono::steady_clock::now(); 55 auto duration = std::chrono::duration_cast<std::chrono::seconds>(end - updateStart).count(); 56 if (duration > timeout) { 57 LOGD("Socket disconnected!"); 58 KillSpId(); 59 } 60 sleep(checkMessageTime); 61 } 62 } 63 UpdatestartTime()64void Heartbeat::UpdatestartTime() 65 { 66 std::unique_lock<std::mutex> lock(mtx); 67 updateStart = std::chrono::steady_clock::now(); 68 lock.unlock(); 69 } 70 71 } 72 }