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__