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 "ThrTaskContainer.h" 17020a203aSopenharmony_ci#include <sys/prctl.h> 18020a203aSopenharmony_ci#include <thread> 19020a203aSopenharmony_ci#include "hiview_logger.h" 20020a203aSopenharmony_ci 21020a203aSopenharmony_cinamespace OHOS { 22020a203aSopenharmony_cinamespace HiviewDFX { 23020a203aSopenharmony_ciDEFINE_LOG_LABEL(0xD002D66, "Hiview-XPerformance"); 24020a203aSopenharmony_ci 25020a203aSopenharmony_ci/* ThrTaskContainer */ 26020a203aSopenharmony_civoid ThrTaskContainer::StartLoop(const std::string& threadName) 27020a203aSopenharmony_ci{ 28020a203aSopenharmony_ci std::thread startLoopThread(&ThrTaskContainer::Entry, this, threadName); 29020a203aSopenharmony_ci startLoopThread.detach(); 30020a203aSopenharmony_ci} 31020a203aSopenharmony_ci 32020a203aSopenharmony_civoid ThrTaskContainer::StopLoop() 33020a203aSopenharmony_ci{ 34020a203aSopenharmony_ci} 35020a203aSopenharmony_ci 36020a203aSopenharmony_civoid ThrTaskContainer::PostTask(ITask* task) 37020a203aSopenharmony_ci{ 38020a203aSopenharmony_ci if (task == nullptr) { 39020a203aSopenharmony_ci throw std::invalid_argument("null task"); 40020a203aSopenharmony_ci } 41020a203aSopenharmony_ci std::unique_lock <std::mutex> uniqueLock(mut); 42020a203aSopenharmony_ci if (!IsTaskOverLimit()) { 43020a203aSopenharmony_ci tasks.push_back(task); 44020a203aSopenharmony_ci } 45020a203aSopenharmony_ci cv.notify_one(); 46020a203aSopenharmony_ci} 47020a203aSopenharmony_ci 48020a203aSopenharmony_cibool ThrTaskContainer::IsTaskOverLimit() 49020a203aSopenharmony_ci{ 50020a203aSopenharmony_ci if (tasks.size() < maxTaskSize) { 51020a203aSopenharmony_ci return false; 52020a203aSopenharmony_ci } 53020a203aSopenharmony_ci HIVIEW_LOGI("CheckTaskVectorLimit over limit"); 54020a203aSopenharmony_ci for (auto& task: tasks) { 55020a203aSopenharmony_ci delete task; 56020a203aSopenharmony_ci task = nullptr; 57020a203aSopenharmony_ci } 58020a203aSopenharmony_ci tasks.clear(); 59020a203aSopenharmony_ci return true; 60020a203aSopenharmony_ci} 61020a203aSopenharmony_ci 62020a203aSopenharmony_civoid ThrTaskContainer::Entry(const std::string& threadName) 63020a203aSopenharmony_ci{ 64020a203aSopenharmony_ci std::unique_lock <std::mutex> uniqueLock(mut); 65020a203aSopenharmony_ci prctl(PR_SET_NAME, threadName.c_str(), nullptr, nullptr, nullptr); 66020a203aSopenharmony_ci while (true) { 67020a203aSopenharmony_ci while (tasks.empty()) { 68020a203aSopenharmony_ci cv.wait(uniqueLock); 69020a203aSopenharmony_ci continue; 70020a203aSopenharmony_ci } 71020a203aSopenharmony_ci ITask* task = tasks.front(); 72020a203aSopenharmony_ci if (task == nullptr) { 73020a203aSopenharmony_ci HIVIEW_LOGE("Entry task is null"); 74020a203aSopenharmony_ci continue; 75020a203aSopenharmony_ci } 76020a203aSopenharmony_ci std::string taskInfo = task->GetTaskInfo(); 77020a203aSopenharmony_ci tasks.erase(tasks.begin()); 78020a203aSopenharmony_ci uniqueLock.unlock(); 79020a203aSopenharmony_ci task->Run(); 80020a203aSopenharmony_ci uniqueLock.lock(); 81020a203aSopenharmony_ci } 82020a203aSopenharmony_ci // delete this;? 83020a203aSopenharmony_ci} 84020a203aSopenharmony_ci} // HiviewDFX 85020a203aSopenharmony_ci} // OHOS