13c3173acSopenharmony_ci/* 23c3173acSopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 33c3173acSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 43c3173acSopenharmony_ci * you may not use this file except in compliance with the License. 53c3173acSopenharmony_ci * You may obtain a copy of the License at 63c3173acSopenharmony_ci * 73c3173acSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 83c3173acSopenharmony_ci * 93c3173acSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 103c3173acSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 113c3173acSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 123c3173acSopenharmony_ci * See the License for the specific language governing permissions and 133c3173acSopenharmony_ci * limitations under the License. 143c3173acSopenharmony_ci */ 153c3173acSopenharmony_ci 163c3173acSopenharmony_ci#include <cstdlib> 173c3173acSopenharmony_ci#include <unistd.h> 183c3173acSopenharmony_ci#include "concurrent_task_log.h" 193c3173acSopenharmony_ci#if !defined(CROSS_PLATFORM) 203c3173acSopenharmony_ci#include "parameters.h" 213c3173acSopenharmony_ci#endif 223c3173acSopenharmony_ci#include "qos_interface.h" 233c3173acSopenharmony_ci#include "qos.h" 243c3173acSopenharmony_ciusing namespace OHOS::ConcurrentTask; 253c3173acSopenharmony_ci 263c3173acSopenharmony_cistatic constexpr int ERROR_NUM = -1; 273c3173acSopenharmony_ci 283c3173acSopenharmony_cinamespace OHOS { 293c3173acSopenharmony_cinamespace QOS { 303c3173acSopenharmony_ciQosController& QosController::GetInstance() 313c3173acSopenharmony_ci{ 323c3173acSopenharmony_ci static QosController instance; 333c3173acSopenharmony_ci return instance; 343c3173acSopenharmony_ci} 353c3173acSopenharmony_ci 363c3173acSopenharmony_ciint QosController::SetThreadQosForOtherThread(enum QosLevel level, int tid) 373c3173acSopenharmony_ci{ 383c3173acSopenharmony_ci#if !defined(CROSS_PLATFORM) 393c3173acSopenharmony_ci bool qosEnable = OHOS::system::GetBoolParameter("persist.qosmanager.setQos.on", true); 403c3173acSopenharmony_ci if (!qosEnable) { 413c3173acSopenharmony_ci CONCUR_LOGD("[Qos] qoslevel %{public}d apply for tid %{public}d disable", static_cast<int>(level), tid); 423c3173acSopenharmony_ci return 0; 433c3173acSopenharmony_ci } 443c3173acSopenharmony_ci#endif 453c3173acSopenharmony_ci int qos = static_cast<int>(level); 463c3173acSopenharmony_ci if (level < QosLevel::QOS_BACKGROUND || level >= QosLevel::QOS_MAX) { 473c3173acSopenharmony_ci CONCUR_LOGE("[Qos] invalid qos level %{public}d", qos); 483c3173acSopenharmony_ci return ERROR_NUM; 493c3173acSopenharmony_ci } 503c3173acSopenharmony_ci int ret = QosApplyForOther(qos, tid); 513c3173acSopenharmony_ci if (ret == 0) { 523c3173acSopenharmony_ci CONCUR_LOGD("[Qos] qoslevel %{public}d apply for tid %{public}d success", qos, tid); 533c3173acSopenharmony_ci } else { 543c3173acSopenharmony_ci CONCUR_LOGD("[Qos] qoslevel %{public}d apply for tid %{public}d failure", qos, tid); 553c3173acSopenharmony_ci } 563c3173acSopenharmony_ci 573c3173acSopenharmony_ci return ret; 583c3173acSopenharmony_ci} 593c3173acSopenharmony_ci 603c3173acSopenharmony_ciint QosController::ResetThreadQosForOtherThread(int tid) 613c3173acSopenharmony_ci{ 623c3173acSopenharmony_ci#if !defined(CROSS_PLATFORM) 633c3173acSopenharmony_ci bool qosEnable = OHOS::system::GetBoolParameter("persist.qosmanager.setQos.on", true); 643c3173acSopenharmony_ci if (!qosEnable) { 653c3173acSopenharmony_ci CONCUR_LOGD("[Qos] qoslevel reset disable for tid %{public}d.", tid); 663c3173acSopenharmony_ci return 0; 673c3173acSopenharmony_ci } 683c3173acSopenharmony_ci#endif 693c3173acSopenharmony_ci int ret = QosLeaveForOther(tid); 703c3173acSopenharmony_ci if (ret == 0) { 713c3173acSopenharmony_ci CONCUR_LOGD("[Qos] qoslevel reset for tid %{public}d success", tid); 723c3173acSopenharmony_ci } else { 733c3173acSopenharmony_ci CONCUR_LOGD("[Qos] qoslevel reset for tid %{public}d failure", tid); 743c3173acSopenharmony_ci } 753c3173acSopenharmony_ci 763c3173acSopenharmony_ci return ret; 773c3173acSopenharmony_ci} 783c3173acSopenharmony_ci 793c3173acSopenharmony_ciint QosController::GetThreadQosForOtherThread(enum QosLevel &level, int tid) 803c3173acSopenharmony_ci{ 813c3173acSopenharmony_ci int qos = -1; 823c3173acSopenharmony_ci int ret = QosGetForOther(tid, qos); 833c3173acSopenharmony_ci if (ret == 0) { 843c3173acSopenharmony_ci if (qos < static_cast<int>(QosLevel::QOS_BACKGROUND) || 853c3173acSopenharmony_ci qos >= static_cast<int>(QosLevel::QOS_MAX)) { 863c3173acSopenharmony_ci CONCUR_LOGE("[Qos] not set qoslevel for tid %{public}d", tid); 873c3173acSopenharmony_ci return ERROR_NUM; 883c3173acSopenharmony_ci } 893c3173acSopenharmony_ci CONCUR_LOGD("[Qos] qoslevel get for tid %{public}d success", tid); 903c3173acSopenharmony_ci level = static_cast<QosLevel>(qos); 913c3173acSopenharmony_ci return ret; 923c3173acSopenharmony_ci } else { 933c3173acSopenharmony_ci CONCUR_LOGD("[Qos] qoslevel get for tid %{public}d failure", tid); 943c3173acSopenharmony_ci return ret; 953c3173acSopenharmony_ci } 963c3173acSopenharmony_ci} 973c3173acSopenharmony_ci 983c3173acSopenharmony_ciint SetThreadQos(enum QosLevel level) 993c3173acSopenharmony_ci{ 1003c3173acSopenharmony_ci int tid = gettid(); 1013c3173acSopenharmony_ci return QosController::GetInstance().SetThreadQosForOtherThread(level, tid); 1023c3173acSopenharmony_ci} 1033c3173acSopenharmony_ci 1043c3173acSopenharmony_ciint SetQosForOtherThread(enum QosLevel level, int tid) 1053c3173acSopenharmony_ci{ 1063c3173acSopenharmony_ci return QosController::GetInstance().SetThreadQosForOtherThread(level, tid); 1073c3173acSopenharmony_ci} 1083c3173acSopenharmony_ci 1093c3173acSopenharmony_ciint ResetThreadQos() 1103c3173acSopenharmony_ci{ 1113c3173acSopenharmony_ci int tid = gettid(); 1123c3173acSopenharmony_ci return QosController::GetInstance().ResetThreadQosForOtherThread(tid); 1133c3173acSopenharmony_ci} 1143c3173acSopenharmony_ci 1153c3173acSopenharmony_ciint ResetQosForOtherThread(int tid) 1163c3173acSopenharmony_ci{ 1173c3173acSopenharmony_ci return QosController::GetInstance().ResetThreadQosForOtherThread(tid); 1183c3173acSopenharmony_ci} 1193c3173acSopenharmony_ci 1203c3173acSopenharmony_ciint GetThreadQos(enum QosLevel &level) 1213c3173acSopenharmony_ci{ 1223c3173acSopenharmony_ci return QosController::GetInstance().GetThreadQosForOtherThread(level, gettid()); 1233c3173acSopenharmony_ci} 1243c3173acSopenharmony_ci 1253c3173acSopenharmony_ciint GetQosForOtherThread(enum QosLevel &level, int tid) 1263c3173acSopenharmony_ci{ 1273c3173acSopenharmony_ci return QosController::GetInstance().GetThreadQosForOtherThread(level, tid); 1283c3173acSopenharmony_ci} 1293c3173acSopenharmony_ci} // namespace QOS 1303c3173acSopenharmony_ci} // namespace OHOS 131