1020a203aSopenharmony_ci/* 2020a203aSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 3020a203aSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4020a203aSopenharmony_ci * you may not use this file except in compliance with the License. 5020a203aSopenharmony_ci * You may obtain a copy of the License at 6020a203aSopenharmony_ci * 7020a203aSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8020a203aSopenharmony_ci * 9020a203aSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10020a203aSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11020a203aSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12020a203aSopenharmony_ci * See the License for the specific language governing permissions and 13020a203aSopenharmony_ci * limitations under the License. 14020a203aSopenharmony_ci */ 15020a203aSopenharmony_ci 16020a203aSopenharmony_ci#include <sys/prctl.h> 17020a203aSopenharmony_ci#include "ThrExecutor.h" 18020a203aSopenharmony_ci#include "hiview_logger.h" 19020a203aSopenharmony_ci 20020a203aSopenharmony_cinamespace OHOS { 21020a203aSopenharmony_cinamespace HiviewDFX { 22020a203aSopenharmony_ciDEFINE_LOG_LABEL(0xD002D66, "Hiview-XPerformance"); 23020a203aSopenharmony_ci 24020a203aSopenharmony_ciconst static std::string MAIN_THREAD_NAME = "XperfMainThr"; 25020a203aSopenharmony_ci 26020a203aSopenharmony_ciThrExecutor::ThrExecutor() 27020a203aSopenharmony_ci{ 28020a203aSopenharmony_ci ThrTaskContainer* contMain = new ThrTaskContainer(); 29020a203aSopenharmony_ci contMain->StartLoop(MAIN_THREAD_NAME.c_str()); 30020a203aSopenharmony_ci containers.insert(std::pair<int, ThrTaskContainer*>(MAIN_THR, contMain)); 31020a203aSopenharmony_ci} 32020a203aSopenharmony_ci 33020a203aSopenharmony_ciThrExecutor::~ThrExecutor() 34020a203aSopenharmony_ci{ 35020a203aSopenharmony_ci for (std::map<int, ThrTaskContainer*>::iterator it = containers.begin(); it != containers.end(); it++) { 36020a203aSopenharmony_ci ThrTaskContainer* con = it->second; 37020a203aSopenharmony_ci if (con != nullptr) { 38020a203aSopenharmony_ci con->StopLoop(); 39020a203aSopenharmony_ci } 40020a203aSopenharmony_ci } 41020a203aSopenharmony_ci} 42020a203aSopenharmony_ci 43020a203aSopenharmony_civoid ThrExecutor::ValidateNonNull(void* task) 44020a203aSopenharmony_ci{ 45020a203aSopenharmony_ci if (task == nullptr) { 46020a203aSopenharmony_ci throw std::invalid_argument("null task"); 47020a203aSopenharmony_ci } 48020a203aSopenharmony_ci} 49020a203aSopenharmony_ci 50020a203aSopenharmony_ciclass ProcessTimoutWrapperTask : public ITask { 51020a203aSopenharmony_cipublic: 52020a203aSopenharmony_ci ProcessTimoutWrapperTask(ITimeoutExecutor::ITimeoutHandler* evtProcessor, std::string name) 53020a203aSopenharmony_ci { 54020a203aSopenharmony_ci this->evtProcessor = evtProcessor; 55020a203aSopenharmony_ci this->name = name; 56020a203aSopenharmony_ci } 57020a203aSopenharmony_ci 58020a203aSopenharmony_ci void Run() 59020a203aSopenharmony_ci { 60020a203aSopenharmony_ci if (evtProcessor != nullptr) { 61020a203aSopenharmony_ci evtProcessor->HandleTimeoutInMainThr(this->name); 62020a203aSopenharmony_ci } 63020a203aSopenharmony_ci delete this; 64020a203aSopenharmony_ci } 65020a203aSopenharmony_ci 66020a203aSopenharmony_ci std::string GetTaskInfo() 67020a203aSopenharmony_ci { 68020a203aSopenharmony_ci return this->taskName; 69020a203aSopenharmony_ci } 70020a203aSopenharmony_ciprivate: 71020a203aSopenharmony_ci const std::string taskName = "ProcessTimoutWrapperTask"; 72020a203aSopenharmony_ci ITimeoutExecutor::ITimeoutHandler* evtProcessor; 73020a203aSopenharmony_ci std::string name; 74020a203aSopenharmony_ci}; 75020a203aSopenharmony_ci 76020a203aSopenharmony_civoid ThrExecutor::ExecuteTimeoutInMainThr(ITimeoutHandler* task, std::string name) 77020a203aSopenharmony_ci{ 78020a203aSopenharmony_ci ValidateNonNull(task); 79020a203aSopenharmony_ci ThrTaskContainer* con = containers[MAIN_THR]; 80020a203aSopenharmony_ci if (con != nullptr) { 81020a203aSopenharmony_ci ITask* evtTask = new ProcessTimoutWrapperTask(task, name); 82020a203aSopenharmony_ci con->PostTask(evtTask); 83020a203aSopenharmony_ci } else { 84020a203aSopenharmony_ci HIVIEW_LOGE("ThrExecutor::ExecuteTimeoutInMainThr main thread task container is null"); 85020a203aSopenharmony_ci } 86020a203aSopenharmony_ci} 87020a203aSopenharmony_ci 88020a203aSopenharmony_ciclass ProcessAppEvtWrapperTask : public ITask { 89020a203aSopenharmony_cipublic: 90020a203aSopenharmony_ci ProcessAppEvtWrapperTask(IAppThrExecutor::IProcessAppEvtTask* task, const IAppThrExecutor::AppEvtData data) 91020a203aSopenharmony_ci { 92020a203aSopenharmony_ci this->evtProcessor = task; 93020a203aSopenharmony_ci this->data = data; 94020a203aSopenharmony_ci } 95020a203aSopenharmony_ci 96020a203aSopenharmony_ci void Run() 97020a203aSopenharmony_ci { 98020a203aSopenharmony_ci if (evtProcessor != nullptr) { 99020a203aSopenharmony_ci evtProcessor->ExecuteProcessAppEvtTaskInMainThr(this->data); 100020a203aSopenharmony_ci } 101020a203aSopenharmony_ci delete this; 102020a203aSopenharmony_ci } 103020a203aSopenharmony_ci 104020a203aSopenharmony_ci std::string GetTaskInfo() 105020a203aSopenharmony_ci { 106020a203aSopenharmony_ci return this->taskName + ", " + data.eventName; 107020a203aSopenharmony_ci } 108020a203aSopenharmony_ciprivate: 109020a203aSopenharmony_ci const std::string taskName = "ProcessAppEvtWrapperTask"; 110020a203aSopenharmony_ci IAppThrExecutor::IProcessAppEvtTask* evtProcessor; 111020a203aSopenharmony_ci IAppThrExecutor::AppEvtData data; 112020a203aSopenharmony_ci}; 113020a203aSopenharmony_ci 114020a203aSopenharmony_civoid ThrExecutor::ExecuteHandleEvtInMainThr(IProcessAppEvtTask* task, const AppEvtData& data) 115020a203aSopenharmony_ci{ 116020a203aSopenharmony_ci ValidateNonNull(task); 117020a203aSopenharmony_ci ThrTaskContainer* con = containers[MAIN_THR]; 118020a203aSopenharmony_ci if (con != nullptr) { 119020a203aSopenharmony_ci ITask* evtTask = new ProcessAppEvtWrapperTask(task, data); 120020a203aSopenharmony_ci con->PostTask(evtTask); 121020a203aSopenharmony_ci } else { 122020a203aSopenharmony_ci HIVIEW_LOGE("ThrExecutor::ExecuteHandleEvtInMainThr main thread task container is null"); 123020a203aSopenharmony_ci } 124020a203aSopenharmony_ci} 125020a203aSopenharmony_ci 126020a203aSopenharmony_ciclass ProcessMonitorEvtWrapperTask : public ITask { 127020a203aSopenharmony_cipublic: 128020a203aSopenharmony_ci ProcessMonitorEvtWrapperTask( 129020a203aSopenharmony_ci IMonitorThrExecutor::IHandleMonitorEvt* handleTask, const std::shared_ptr <XperfEvt> evt) 130020a203aSopenharmony_ci { 131020a203aSopenharmony_ci this->handleTask = handleTask; 132020a203aSopenharmony_ci this->evt = evt; 133020a203aSopenharmony_ci } 134020a203aSopenharmony_ci 135020a203aSopenharmony_ci void Run() 136020a203aSopenharmony_ci { 137020a203aSopenharmony_ci if (handleTask != nullptr) { 138020a203aSopenharmony_ci handleTask->HandleMainThrEvt(this->evt); 139020a203aSopenharmony_ci } 140020a203aSopenharmony_ci delete this; 141020a203aSopenharmony_ci } 142020a203aSopenharmony_ci 143020a203aSopenharmony_ci std::string GetTaskInfo() 144020a203aSopenharmony_ci { 145020a203aSopenharmony_ci return this->taskName; 146020a203aSopenharmony_ci } 147020a203aSopenharmony_ciprivate: 148020a203aSopenharmony_ci const std::string taskName = "ProcessMonitorEvtWrapperTask"; 149020a203aSopenharmony_ci IMonitorThrExecutor::IHandleMonitorEvt* handleTask; 150020a203aSopenharmony_ci std::shared_ptr <XperfEvt> evt; 151020a203aSopenharmony_ci}; 152020a203aSopenharmony_ci 153020a203aSopenharmony_civoid ThrExecutor::ExecuteMonitorInMainThr(IHandleMonitorEvt* task, std::shared_ptr <XperfEvt> evt) 154020a203aSopenharmony_ci{ 155020a203aSopenharmony_ci ValidateNonNull(task); 156020a203aSopenharmony_ci ThrTaskContainer* con = containers[MAIN_THR]; 157020a203aSopenharmony_ci if (con != nullptr) { 158020a203aSopenharmony_ci ITask* evtTask = new ProcessMonitorEvtWrapperTask(task, evt); 159020a203aSopenharmony_ci con->PostTask(evtTask); 160020a203aSopenharmony_ci } else { 161020a203aSopenharmony_ci HIVIEW_LOGE("ThrExecutor::ExecuteMonitorInMainThr main thread task container is null"); 162020a203aSopenharmony_ci } 163020a203aSopenharmony_ci} 164020a203aSopenharmony_ci} // HiviewDFX 165020a203aSopenharmony_ci} // OHOS