1484543d1Sopenharmony_ci/* 2484543d1Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 3484543d1Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4484543d1Sopenharmony_ci * you may not use this file except in compliance with the License. 5484543d1Sopenharmony_ci * You may obtain a copy of the License at 6484543d1Sopenharmony_ci * 7484543d1Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8484543d1Sopenharmony_ci * 9484543d1Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10484543d1Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11484543d1Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12484543d1Sopenharmony_ci * See the License for the specific language governing permissions and 13484543d1Sopenharmony_ci * limitations under the License. 14484543d1Sopenharmony_ci */ 15484543d1Sopenharmony_ci 16484543d1Sopenharmony_ci#ifndef __FFRT_PERF_H__ 17484543d1Sopenharmony_ci#define __FFRT_PERF_H__ 18484543d1Sopenharmony_ci#include "ffrt_trace.h" 19484543d1Sopenharmony_ci 20484543d1Sopenharmony_ci// default disabled for ffrt, enable it for debugging or playback 21484543d1Sopenharmony_ci#ifdef FFRT_PERF_ENABLE 22484543d1Sopenharmony_cistruct PerfEU { 23484543d1Sopenharmony_ci static constexpr size_t qos_max = 15; 24484543d1Sopenharmony_ci static inline std::atomic_int worker_num[qos_max] = {0}; 25484543d1Sopenharmony_ci static inline const char* worker_num_tag[qos_max] = { 26484543d1Sopenharmony_ci "qos0_wrk", 27484543d1Sopenharmony_ci "qos1_wrk", 28484543d1Sopenharmony_ci "qos2_wrk", 29484543d1Sopenharmony_ci "qos3_wrk", 30484543d1Sopenharmony_ci "qos4_wrk", 31484543d1Sopenharmony_ci "qos5_wrk", 32484543d1Sopenharmony_ci "qos6_wrk", 33484543d1Sopenharmony_ci "qos7_wrk", 34484543d1Sopenharmony_ci "qos8_wrk", 35484543d1Sopenharmony_ci "qos9_wrk", 36484543d1Sopenharmony_ci "qos10_wrk", 37484543d1Sopenharmony_ci "qos11_wrk", 38484543d1Sopenharmony_ci "qos12_wrk", 39484543d1Sopenharmony_ci "qos13_wrk", 40484543d1Sopenharmony_ci "qos14_wrk" 41484543d1Sopenharmony_ci }; 42484543d1Sopenharmony_ci 43484543d1Sopenharmony_ci static inline const char* task_num_tag[qos_max] = { 44484543d1Sopenharmony_ci "qos0_tsk", 45484543d1Sopenharmony_ci "qos1_tsk", 46484543d1Sopenharmony_ci "qos2_tsk", 47484543d1Sopenharmony_ci "qos3_tsk", 48484543d1Sopenharmony_ci "qos4_tsk", 49484543d1Sopenharmony_ci "qos5_tsk", 50484543d1Sopenharmony_ci "qos6_tsk", 51484543d1Sopenharmony_ci "qos7_tsk", 52484543d1Sopenharmony_ci "qos8_tsk", 53484543d1Sopenharmony_ci "qos9_tsk", 54484543d1Sopenharmony_ci "qos10_tsk", 55484543d1Sopenharmony_ci "qos11_tsk", 56484543d1Sopenharmony_ci "qos12_tsk", 57484543d1Sopenharmony_ci "qos13_tsk", 58484543d1Sopenharmony_ci "qos14_tsk" 59484543d1Sopenharmony_ci }; 60484543d1Sopenharmony_ci 61484543d1Sopenharmony_ci static inline const char* worker_wake_tag[qos_max] = { 62484543d1Sopenharmony_ci "qos0_wake", 63484543d1Sopenharmony_ci "qos1_wake", 64484543d1Sopenharmony_ci "qos2_wake", 65484543d1Sopenharmony_ci "qos3_wake", 66484543d1Sopenharmony_ci "qos4_wake", 67484543d1Sopenharmony_ci "qos5_wake", 68484543d1Sopenharmony_ci "qos6_wake", 69484543d1Sopenharmony_ci "qos7_wake", 70484543d1Sopenharmony_ci "qos8_wake", 71484543d1Sopenharmony_ci "qos9_wake", 72484543d1Sopenharmony_ci "qos10_wake", 73484543d1Sopenharmony_ci "qos11_wake", 74484543d1Sopenharmony_ci "qos12_wake", 75484543d1Sopenharmony_ci "qos13_wake", 76484543d1Sopenharmony_ci "qos14_wake" 77484543d1Sopenharmony_ci }; 78484543d1Sopenharmony_ci}; 79484543d1Sopenharmony_ci 80484543d1Sopenharmony_ciinline void FFRTPerfWorkerIdle(int qos) 81484543d1Sopenharmony_ci{ 82484543d1Sopenharmony_ci if (qos >= 0 && qos < static_cast<int>(PerfEU::qos_max)) { 83484543d1Sopenharmony_ci FFRT_TRACE_COUNT(PerfEU::worker_num_tag[qos], 84484543d1Sopenharmony_ci PerfEU::worker_num[qos].fetch_sub(1, std::memory_order_relaxed) - 1); 85484543d1Sopenharmony_ci } 86484543d1Sopenharmony_ci} 87484543d1Sopenharmony_ci 88484543d1Sopenharmony_ciinline void FFRTPerfWorkerAwake(int qos) 89484543d1Sopenharmony_ci{ 90484543d1Sopenharmony_ci if (qos >= 0 && qos < static_cast<int>(PerfEU::qos_max)) { 91484543d1Sopenharmony_ci FFRT_TRACE_COUNT(PerfEU::worker_num_tag[qos], 92484543d1Sopenharmony_ci PerfEU::worker_num[qos].fetch_add(1, std::memory_order_relaxed) + 1); 93484543d1Sopenharmony_ci } 94484543d1Sopenharmony_ci} 95484543d1Sopenharmony_ci 96484543d1Sopenharmony_ciinline void FFRTPerfWorkerWake(int qos) 97484543d1Sopenharmony_ci{ 98484543d1Sopenharmony_ci if (qos >= 0 && qos < static_cast<int>(PerfEU::qos_max)) { 99484543d1Sopenharmony_ci FFRT_TRACE_COUNT(PerfEU::worker_wake_tag[qos], 0); 100484543d1Sopenharmony_ci } 101484543d1Sopenharmony_ci} 102484543d1Sopenharmony_ci 103484543d1Sopenharmony_ciinline void FFRTPerfTaskNum(int qos, int taskn) 104484543d1Sopenharmony_ci{ 105484543d1Sopenharmony_ci if (qos >= 0 && qos < static_cast<int>(PerfEU::qos_max)) { 106484543d1Sopenharmony_ci FFRT_TRACE_COUNT(PerfEU::task_num_tag[qos], taskn); 107484543d1Sopenharmony_ci } 108484543d1Sopenharmony_ci} 109484543d1Sopenharmony_ci 110484543d1Sopenharmony_ci#define FFRT_PERF_WORKER_IDLE(qos) FFRTPerfWorkerIdle(qos) 111484543d1Sopenharmony_ci#define FFRT_PERF_WORKER_AWAKE(qos) FFRTPerfWorkerAwake(qos) 112484543d1Sopenharmony_ci#define FFRT_PERF_WORKER_WAKE(qos) FFRTPerfWorkerWake(qos) 113484543d1Sopenharmony_ci#define FFRT_PERF_TASK_NUM(qos, taskn) FFRTPerfTaskNum(qos, taskn) 114484543d1Sopenharmony_ci#else 115484543d1Sopenharmony_ci#define FFRT_PERF_WORKER_IDLE(qos) 116484543d1Sopenharmony_ci#define FFRT_PERF_WORKER_AWAKE(qos) 117484543d1Sopenharmony_ci#define FFRT_PERF_WORKER_WAKE(qos) 118484543d1Sopenharmony_ci#define FFRT_PERF_TASK_NUM(qos, taskn) 119484543d1Sopenharmony_ci#endif 120484543d1Sopenharmony_ci 121484543d1Sopenharmony_ci#endif // __FFRT_PERF_H__