1 /* 2 * Copyright (c) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef __FFRT_TRACE_H__ 17 #define __FFRT_TRACE_H__ 18 19 #include <atomic> 20 #include <chrono> 21 #include "internal_inc/osal.h" 22 23 #ifdef FFRT_OH_TRACE_ENABLE 24 #include "hitrace_meter.h" 25 #endif 26 27 namespace ffrt { 28 enum TraceLevel { 29 TRACE_LEVEL0 = 0, 30 TRACE_LEVEL1, 31 TRACE_LEVEL2, 32 TRACE_LEVEL3, // lowest level, trace all 33 TRACE_LEVEL_MAX, 34 }; 35 36 class TraceLevelManager { 37 public: 38 TraceLevelManager(); 39 ~TraceLevelManager() = default; 40 GetTraceLevel()41 uint64_t GetTraceLevel() const 42 { 43 return traceLevel_; 44 } 45 Instance()46 static inline TraceLevelManager* Instance() 47 { 48 static TraceLevelManager ins; 49 return &ins; 50 } 51 52 private: 53 uint8_t traceLevel_; 54 }; 55 56 class ScopedTrace { 57 public: 58 ScopedTrace(uint64_t level, const char* name); 59 ~ScopedTrace(); 60 61 private: 62 std::atomic<bool> isTraceEnable_; 63 }; 64 } // namespace ffrt 65 66 #ifdef FFRT_OH_TRACE_ENABLE 67 #define FFRT_TRACE_BEGIN(tag) StartTrace(HITRACE_TAG_FFRT, tag, -1) 68 #define FFRT_TRACE_END() FinishTrace(HITRACE_TAG_FFRT) 69 #define FFRT_TRACE_ASYNC_BEGIN(tag, tid) StartAsyncTrace(HITRACE_TAG_FFRT, tag, tid, -1) 70 #define FFRT_TRACE_ASYNC_END(tag, tid) FinishAsyncTrace(HITRACE_TAG_FFRT, tag, tid) 71 #define FFRT_TRACE_SCOPE(level, tag) ffrt::ScopedTrace __tracer##tag(level, #tag) 72 #else 73 #define FFRT_TRACE_BEGIN(tag) 74 #define FFRT_TRACE_END() 75 #define FFRT_TRACE_SCOPE(level, tag) 76 #endif 77 78 // DFX Trace for FFRT Task Statistics 79 #ifdef FFRT_OH_TASK_STAT_ENABLE 80 #define FFRT_WORKER_IDLE_BEGIN_MARKER() 81 #define FFRT_WORKER_IDLE_END_MARKER() 82 #define FFRT_SUBMIT_MARKER(tag, gid) \ 83 { \ 84 FFRT_TRACE_BEGIN(("P[" + (tag) + "]|" + std::to_string(gid)).c_str()); \ 85 FFRT_TRACE_END(); \ 86 } 87 #define FFRT_READY_MARKER(gid) \ 88 { \ 89 FFRT_TRACE_ASYNC_END("R", gid); \ 90 } 91 #define FFRT_BLOCK_MARKER(gid) \ 92 { \ 93 FFRT_TRACE_ASYNC_END("B", gid); \ 94 } 95 #define FFRT_TASKDONE_MARKER(gid) \ 96 { \ 97 FFRT_TRACE_ASYNC_END("F", gid); \ 98 } 99 #define FFRT_FAKE_TRACE_MARKER(gid) \ 100 { \ 101 FFRT_TRACE_ASYNC_END("Co", gid); \ 102 } 103 #define FFRT_TASK_BEGIN(tag, gid) \ 104 { \ 105 FFRT_TRACE_BEGIN(("FFRT::[" + (tag) + "]|" + std::to_string(gid)).c_str()); \ 106 } 107 #define FFRT_TASK_END() \ 108 { \ 109 FFRT_TRACE_END(); \ 110 } 111 #define FFRT_BLOCK_TRACER(gid, tag) \ 112 { \ 113 FFRT_TRACE_BEGIN(("FFBK[" #tag "]|" + std::to_string(gid)).c_str()); \ 114 FFRT_TRACE_END(); \ 115 } 116 #define FFRT_WAKE_TRACER(gid) \ 117 { \ 118 FFRT_TRACE_BEGIN(("FFWK|" + std::to_string(gid)).c_str()); \ 119 FFRT_TRACE_END(); \ 120 } 121 #else 122 #define FFRT_WORKER_IDLE_BEGIN_MARKER() 123 #define FFRT_WORKER_IDLE_END_MARKER() 124 #define FFRT_SUBMIT_MARKER(tag, gid) 125 #define FFRT_READY_MARKER(gid) 126 #define FFRT_BLOCK_MARKER(gid) 127 #define FFRT_TASKDONE_MARKER(gid) 128 #define FFRT_FAKE_TRACE_MARKER(gid) 129 #define FFRT_TASK_BEGIN(tag, gid) 130 #define FFRT_TASK_END() 131 #define FFRT_BLOCK_TRACER(gid, tag) 132 #define FFRT_WAKE_TRACER(gid) 133 #endif 134 #endif