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