• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 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 FOUNDATION_ACE_FRAMEWORKS_BASE_LOG_ACE_TRACE_H
17 #define FOUNDATION_ACE_FRAMEWORKS_BASE_LOG_ACE_TRACE_H
18 
19 #include <atomic>
20 #include <cstdarg>
21 #include <cstdio>
22 #include <memory>
23 #include <string>
24 
25 #include "base/utils/macros.h"
26 #include "base/utils/noncopyable.h"
27 #include "base/utils/system_properties.h"
28 
29 #define ACE_SCOPED_TRACE(fmt, ...) AceScopedTrace aceScopedTrace(fmt, ##__VA_ARGS__)
30 #define ACE_SCOPED_TRACE_COMMERCIAL(fmt, ...) AceScopedTraceCommercial aceScopedTrace(fmt, ##__VA_ARGS__)
31 #define ACE_SCOPED_TRACE_FLAG(flag, fmt, ...) AceScopedTraceFlag aceScopedTraceFlag(flag, fmt, ##__VA_ARGS__)
32 #define ACE_SVG_SCOPED_TRACE(fmt, ...) \
33     AceScopedTraceFlag aceScopedTraceFlag(SystemProperties::GetSvgTraceEnabled(), fmt, ##__VA_ARGS__)
34 #define ACE_TEXT_SCOPED_TRACE(fmt, ...) \
35     AceScopedTraceFlag aceScopedTraceFlag(SystemProperties::GetTextTraceEnabled(), fmt, ##__VA_ARGS__)
36 #define ACE_SYNTAX_SCOPED_TRACE(fmt, ...) \
37     AceScopedTraceFlag aceScopedTraceFlag(SystemProperties::GetSyntaxTraceEnabled(), fmt, ##__VA_ARGS__)
38 #define ACE_ACCESS_SCOPED_TRACE(fmt, ...) \
39     AceScopedTraceFlag aceScopedTraceFlag(SystemProperties::GetAccessTraceEnabled(), fmt, ##__VA_ARGS__)
40 #define ACE_LAYOUT_SCOPED_TRACE(fmt, ...) \
41     AceScopedTraceFlag aceScopedTraceFlag(SystemProperties::GetLayoutTraceEnabled(), fmt, ##__VA_ARGS__)
42 #define ACE_IMAGE_SCOPED_TRACE(fmt, ...) \
43     AceScopedTraceFlag aceScopedTraceFlag(SystemProperties::GetDebugEnabled(), fmt, ##__VA_ARGS__)
44 #define ACE_MEASURE_SCOPED_TRACE(fmt, ...) \
45     AceScopedTraceFlag aceScopedTraceFlag(SystemProperties::GetMeasureDebugTraceEnabled(), fmt, ##__VA_ARGS__)
46 #define ACE_SAFE_AREA_SCOPED_TRACE(fmt, ...) \
47     AceScopedTraceFlag aceScopedTraceFlag(SystemProperties::GetSafeAreaDebugTraceEnabled(), fmt, ##__VA_ARGS__)
48 #define ACE_VSYNC_MODE_SCOPED_TRACE(fmt, ...) \
49     AceScopedTraceFlag aceScopedTraceFlag(SystemProperties::GetVsyncModeTraceEnabled(), fmt, ##__VA_ARGS__)
50 #define ACE_EVENT_SCOPED_TRACE(fmt, ...) \
51     AceScopedTraceFlag aceScopedTraceFlag(SystemProperties::GetTraceInputEventEnabled(), fmt, ##__VA_ARGS__)
52 #define ACE_REUSE_DETECTION_SCOPED_TRACE(fmt, ...) \
53     AceScopedTraceFlag aceScopedTraceFlag(SystemProperties::GetDynamicDetectionTraceEnabled(), fmt, ##__VA_ARGS__)
54 #ifdef ACE_DEBUG
55 #define ACE_DEBUG_SCOPED_TRACE(fmt, ...) AceScopedTrace aceScopedTrace(fmt, ##__VA_ARGS__)
56 #else
57 #define ACE_DEBUG_SCOPED_TRACE(fmt, ...)
58 #endif
59 
60 #define ACE_LAYOUT_TRACE_BEGIN(fmt, ...) \
61     if (SystemProperties::GetLayoutTraceEnabled()) { \
62         AceTraceBeginWithArgs(fmt, ##__VA_ARGS__); \
63     }
64 #define ACE_LAYOUT_TRACE_END() \
65     if (SystemProperties::GetLayoutTraceEnabled()) { \
66         AceTraceEnd(); \
67     }
68 
69 // Enable trace for component creation and attribute settings
70 #define ACE_BUILD_TRACE_BEGIN(fmt, ...) \
71     if (SystemProperties::GetBuildTraceEnabled()) { \
72         AceTraceBeginWithArgs(fmt, ##__VA_ARGS__); \
73     }
74 #define ACE_BUILD_TRACE_END() \
75     if (SystemProperties::GetBuildTraceEnabled()) { \
76         AceTraceEnd(); \
77     }
78 
79 #define CHECK_NULL_VOID_LAYOUT_TRACE_END(ptr) \
80     do {                           \
81         if (!(ptr)) {              \
82             if (SystemProperties::GetLayoutTraceEnabled()) { \
83                 AceTraceEnd();     \
84             }                      \
85             return;                \
86         }                          \
87     } while (0)                    \
88 
89 #define ACE_FUNCTION_TRACE() ACE_SCOPED_TRACE(__func__)
90 #define ACE_FUNCTION_TRACE_COMMERCIAL() ACE_SCOPED_TRACE_COMMERCIAL(__func__)
91 
92 #define ACE_COUNT_TRACE(count, fmt, ...) AceCountTraceWidthArgs(count, fmt, ##__VA_ARGS__)
93 
94 namespace OHOS::Ace {
95 bool ACE_EXPORT AceAsyncTraceEnable();
96 void ACE_EXPORT AceTraceBegin(const char* name);
97 void ACE_EXPORT AceAsyncTraceBegin(int32_t taskId, const char* name, bool isAnimationTrace = false);
98 bool ACE_EXPORT AceTraceBeginWithArgs(const char* format, ...) __attribute__((__format__(printf, 1, 2)));
99 std::string ACE_EXPORT AceAsyncTraceBeginWithArgs(int32_t taskId, char* format, ...);
100 bool ACE_EXPORT AceTraceBeginWithArgv(const char* format, va_list args);
101 std::string ACE_EXPORT AceAsyncTraceBeginWithArgv(int32_t taskId, const char* format, va_list args);
102 void ACE_EXPORT AceTraceEnd();
103 void ACE_EXPORT AceAsyncTraceEnd(int32_t taskId, const char* name, bool isAnimationTrace = false);
104 void ACE_EXPORT AceCountTrace(const char *key, int32_t count);
105 void ACE_EXPORT AceCountTraceWidthArgs(int32_t count, const char* format, ...);
106 
107 // for commercial trace
108 void ACE_EXPORT AceTraceBeginCommercial(const char* name);
109 void ACE_EXPORT AceTraceEndCommercial();
110 void ACE_EXPORT AceAsyncTraceBeginCommercial(int32_t taskId, const char* name, bool isAnimationTrace = false);
111 void ACE_EXPORT AceAsyncTraceEndCommercial(int32_t taskId, const char* name, bool isAnimationTrace = false);
112 
113 class ACE_FORCE_EXPORT AceScopedTrace final {
114 public:
115     explicit AceScopedTrace(const char* format, ...) __attribute__((__format__(printf, 2, 3)));
116     ~AceScopedTrace();
117 
118     ACE_DISALLOW_COPY_AND_MOVE(AceScopedTrace);
119 private:
120     bool strValid_ = false;
121 };
122 
123 class ACE_FORCE_EXPORT AceScopedTraceCommercial final {
124 public:
125     explicit AceScopedTraceCommercial(const char* format, ...) __attribute__((__format__(printf, 2, 3)));
126     ~AceScopedTraceCommercial();
127 
128     ACE_DISALLOW_COPY_AND_MOVE(AceScopedTraceCommercial);
129 private:
130     bool strValid_ = false;
131 };
132 
133 class ACE_FORCE_EXPORT AceScopedTraceFlag final {
134 public:
135     AceScopedTraceFlag(bool flag, const char* format, ...) __attribute__((__format__(printf, 3, 4)));
136     ~AceScopedTraceFlag();
137 
138     ACE_DISALLOW_COPY_AND_MOVE(AceScopedTraceFlag);
139 
140 private:
141     bool flagTraceEnabled_ { false };
142 };
143 
144 class ACE_EXPORT AceAsyncScopedTrace final {
145 public:
146     AceAsyncScopedTrace(const char* format, ...);
147     ~AceAsyncScopedTrace();
148 
149     ACE_DISALLOW_COPY_AND_MOVE(AceAsyncScopedTrace);
150 
151 private:
152     std::string name_;
153     int32_t taskId_;
154     static std::atomic<std::int32_t> id_;
155 };
156 
157 } // namespace OHOS::Ace
158 
159 #endif // FOUNDATION_ACE_FRAMEWORKS_BASE_LOG_ACE_TRACE_H
160