xref: /aosp_15_r20/system/logging/liblog/include/log/log_main.h (revision 598139dc91b21518d67c408eaea2644226490971)
1*598139dcSAndroid Build Coastguard Worker /*
2*598139dcSAndroid Build Coastguard Worker  * Copyright (C) 2005-2017 The Android Open Source Project
3*598139dcSAndroid Build Coastguard Worker  *
4*598139dcSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*598139dcSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*598139dcSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*598139dcSAndroid Build Coastguard Worker  *
8*598139dcSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*598139dcSAndroid Build Coastguard Worker  *
10*598139dcSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*598139dcSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*598139dcSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*598139dcSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*598139dcSAndroid Build Coastguard Worker  * limitations under the License.
15*598139dcSAndroid Build Coastguard Worker  */
16*598139dcSAndroid Build Coastguard Worker 
17*598139dcSAndroid Build Coastguard Worker #pragma once
18*598139dcSAndroid Build Coastguard Worker 
19*598139dcSAndroid Build Coastguard Worker #include <stdbool.h>
20*598139dcSAndroid Build Coastguard Worker #include <sys/cdefs.h>
21*598139dcSAndroid Build Coastguard Worker #include <sys/types.h>
22*598139dcSAndroid Build Coastguard Worker 
23*598139dcSAndroid Build Coastguard Worker #include <android/log.h>
24*598139dcSAndroid Build Coastguard Worker 
25*598139dcSAndroid Build Coastguard Worker __BEGIN_DECLS
26*598139dcSAndroid Build Coastguard Worker 
27*598139dcSAndroid Build Coastguard Worker /*
28*598139dcSAndroid Build Coastguard Worker  * Normally we strip the effects of ALOGV (VERBOSE messages),
29*598139dcSAndroid Build Coastguard Worker  * LOG_FATAL and LOG_FATAL_IF (FATAL assert messages) from the
30*598139dcSAndroid Build Coastguard Worker  * release builds by defining NDEBUG.  You can modify this (for
31*598139dcSAndroid Build Coastguard Worker  * example with "#define LOG_NDEBUG 0" at the top of your source
32*598139dcSAndroid Build Coastguard Worker  * file) to change that behavior.
33*598139dcSAndroid Build Coastguard Worker  */
34*598139dcSAndroid Build Coastguard Worker 
35*598139dcSAndroid Build Coastguard Worker #ifndef LOG_NDEBUG
36*598139dcSAndroid Build Coastguard Worker #ifdef NDEBUG
37*598139dcSAndroid Build Coastguard Worker #define LOG_NDEBUG 1
38*598139dcSAndroid Build Coastguard Worker #else
39*598139dcSAndroid Build Coastguard Worker #define LOG_NDEBUG 0
40*598139dcSAndroid Build Coastguard Worker #endif
41*598139dcSAndroid Build Coastguard Worker #endif
42*598139dcSAndroid Build Coastguard Worker 
43*598139dcSAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
44*598139dcSAndroid Build Coastguard Worker 
45*598139dcSAndroid Build Coastguard Worker /*
46*598139dcSAndroid Build Coastguard Worker  * This file uses ", ## __VA_ARGS__" zero-argument token pasting to
47*598139dcSAndroid Build Coastguard Worker  * work around issues with debug-only syntax errors in assertions
48*598139dcSAndroid Build Coastguard Worker  * that are missing format strings.  See commit
49*598139dcSAndroid Build Coastguard Worker  * 19299904343daf191267564fe32e6cd5c165cd42
50*598139dcSAndroid Build Coastguard Worker  */
51*598139dcSAndroid Build Coastguard Worker #if defined(__clang__)
52*598139dcSAndroid Build Coastguard Worker #pragma clang diagnostic push
53*598139dcSAndroid Build Coastguard Worker #pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments"
54*598139dcSAndroid Build Coastguard Worker #endif
55*598139dcSAndroid Build Coastguard Worker 
56*598139dcSAndroid Build Coastguard Worker /*
57*598139dcSAndroid Build Coastguard Worker  * Use __VA_ARGS__ if running a static analyzer,
58*598139dcSAndroid Build Coastguard Worker  * to avoid warnings of unused variables in __VA_ARGS__.
59*598139dcSAndroid Build Coastguard Worker  * Use constexpr function in C++ mode, so these macros can be used
60*598139dcSAndroid Build Coastguard Worker  * in other constexpr functions without warning.
61*598139dcSAndroid Build Coastguard Worker  */
62*598139dcSAndroid Build Coastguard Worker #ifdef __clang_analyzer__
63*598139dcSAndroid Build Coastguard Worker #ifdef __cplusplus
64*598139dcSAndroid Build Coastguard Worker extern "C++" {
65*598139dcSAndroid Build Coastguard Worker template <typename... Ts>
__fake_use_va_args(Ts...)66*598139dcSAndroid Build Coastguard Worker constexpr int __fake_use_va_args(Ts...) {
67*598139dcSAndroid Build Coastguard Worker   return 0;
68*598139dcSAndroid Build Coastguard Worker }
69*598139dcSAndroid Build Coastguard Worker }
70*598139dcSAndroid Build Coastguard Worker #else
71*598139dcSAndroid Build Coastguard Worker extern int __fake_use_va_args(int, ...);
72*598139dcSAndroid Build Coastguard Worker #endif /* __cplusplus */
73*598139dcSAndroid Build Coastguard Worker #define __FAKE_USE_VA_ARGS(...) ((void)__fake_use_va_args(0, ##__VA_ARGS__))
74*598139dcSAndroid Build Coastguard Worker #else
75*598139dcSAndroid Build Coastguard Worker #define __FAKE_USE_VA_ARGS(...) ((void)(0))
76*598139dcSAndroid Build Coastguard Worker #endif /* __clang_analyzer__ */
77*598139dcSAndroid Build Coastguard Worker 
78*598139dcSAndroid Build Coastguard Worker #ifndef __predict_false
79*598139dcSAndroid Build Coastguard Worker #define __predict_false(exp) __builtin_expect((exp) != 0, 0)
80*598139dcSAndroid Build Coastguard Worker #endif
81*598139dcSAndroid Build Coastguard Worker 
82*598139dcSAndroid Build Coastguard Worker #define android_writeLog(prio, tag, text) __android_log_write(prio, tag, text)
83*598139dcSAndroid Build Coastguard Worker 
84*598139dcSAndroid Build Coastguard Worker #define android_printLog(prio, tag, ...) \
85*598139dcSAndroid Build Coastguard Worker   __android_log_print(prio, tag, __VA_ARGS__)
86*598139dcSAndroid Build Coastguard Worker 
87*598139dcSAndroid Build Coastguard Worker #define android_vprintLog(prio, cond, tag, ...) \
88*598139dcSAndroid Build Coastguard Worker   __android_log_vprint(prio, tag, __VA_ARGS__)
89*598139dcSAndroid Build Coastguard Worker 
90*598139dcSAndroid Build Coastguard Worker /*
91*598139dcSAndroid Build Coastguard Worker  * Log macro that allows you to specify a number for the priority.
92*598139dcSAndroid Build Coastguard Worker  */
93*598139dcSAndroid Build Coastguard Worker #ifndef LOG_PRI
94*598139dcSAndroid Build Coastguard Worker #define LOG_PRI(priority, tag, ...) android_printLog(priority, tag, __VA_ARGS__)
95*598139dcSAndroid Build Coastguard Worker #endif
96*598139dcSAndroid Build Coastguard Worker 
97*598139dcSAndroid Build Coastguard Worker /*
98*598139dcSAndroid Build Coastguard Worker  * Log macro that allows you to pass in a varargs ("args" is a va_list).
99*598139dcSAndroid Build Coastguard Worker  */
100*598139dcSAndroid Build Coastguard Worker #ifndef LOG_PRI_VA
101*598139dcSAndroid Build Coastguard Worker #define LOG_PRI_VA(priority, tag, fmt, args) \
102*598139dcSAndroid Build Coastguard Worker   android_vprintLog(priority, NULL, tag, fmt, args)
103*598139dcSAndroid Build Coastguard Worker #endif
104*598139dcSAndroid Build Coastguard Worker 
105*598139dcSAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
106*598139dcSAndroid Build Coastguard Worker 
107*598139dcSAndroid Build Coastguard Worker /* XXX Macros to work around syntax errors in places where format string
108*598139dcSAndroid Build Coastguard Worker  * arg is not passed to ALOG_ASSERT, LOG_ALWAYS_FATAL or LOG_ALWAYS_FATAL_IF
109*598139dcSAndroid Build Coastguard Worker  * (happens only in debug builds).
110*598139dcSAndroid Build Coastguard Worker  */
111*598139dcSAndroid Build Coastguard Worker 
112*598139dcSAndroid Build Coastguard Worker /* Returns 2nd arg.  Used to substitute default value if caller's vararg list
113*598139dcSAndroid Build Coastguard Worker  * is empty.
114*598139dcSAndroid Build Coastguard Worker  */
115*598139dcSAndroid Build Coastguard Worker #define __android_second(dummy, second, ...) second
116*598139dcSAndroid Build Coastguard Worker 
117*598139dcSAndroid Build Coastguard Worker /* If passed multiple args, returns ',' followed by all but 1st arg, otherwise
118*598139dcSAndroid Build Coastguard Worker  * returns nothing.
119*598139dcSAndroid Build Coastguard Worker  */
120*598139dcSAndroid Build Coastguard Worker #define __android_rest(first, ...) , ##__VA_ARGS__
121*598139dcSAndroid Build Coastguard Worker 
122*598139dcSAndroid Build Coastguard Worker #define android_printAssert(cond, tag, ...)                     \
123*598139dcSAndroid Build Coastguard Worker   __android_log_assert(cond, tag,                               \
124*598139dcSAndroid Build Coastguard Worker                        __android_second(0, ##__VA_ARGS__, NULL) \
125*598139dcSAndroid Build Coastguard Worker                            __android_rest(__VA_ARGS__))
126*598139dcSAndroid Build Coastguard Worker 
127*598139dcSAndroid Build Coastguard Worker /*
128*598139dcSAndroid Build Coastguard Worker  * Log a fatal error.  If the given condition fails, this stops program
129*598139dcSAndroid Build Coastguard Worker  * execution like a normal assertion, but also generating the given message.
130*598139dcSAndroid Build Coastguard Worker  * It is NOT stripped from release builds.  Note that the condition test
131*598139dcSAndroid Build Coastguard Worker  * is -inverted- from the normal assert() semantics.
132*598139dcSAndroid Build Coastguard Worker  */
133*598139dcSAndroid Build Coastguard Worker #ifndef LOG_ALWAYS_FATAL_IF
134*598139dcSAndroid Build Coastguard Worker #define LOG_ALWAYS_FATAL_IF(cond, ...)                                                    \
135*598139dcSAndroid Build Coastguard Worker   ((__predict_false(cond)) ? (__FAKE_USE_VA_ARGS(__VA_ARGS__),                            \
136*598139dcSAndroid Build Coastguard Worker                               ((void)android_printAssert(#cond, LOG_TAG, ##__VA_ARGS__))) \
137*598139dcSAndroid Build Coastguard Worker                            : ((void)0))
138*598139dcSAndroid Build Coastguard Worker #endif
139*598139dcSAndroid Build Coastguard Worker 
140*598139dcSAndroid Build Coastguard Worker #ifndef LOG_ALWAYS_FATAL
141*598139dcSAndroid Build Coastguard Worker #define LOG_ALWAYS_FATAL(...) \
142*598139dcSAndroid Build Coastguard Worker   (((void)android_printAssert(NULL, LOG_TAG, ##__VA_ARGS__)))
143*598139dcSAndroid Build Coastguard Worker #endif
144*598139dcSAndroid Build Coastguard Worker 
145*598139dcSAndroid Build Coastguard Worker /*
146*598139dcSAndroid Build Coastguard Worker  * Versions of LOG_ALWAYS_FATAL_IF and LOG_ALWAYS_FATAL that
147*598139dcSAndroid Build Coastguard Worker  * are stripped out of release builds.
148*598139dcSAndroid Build Coastguard Worker  */
149*598139dcSAndroid Build Coastguard Worker 
150*598139dcSAndroid Build Coastguard Worker #if LOG_NDEBUG
151*598139dcSAndroid Build Coastguard Worker 
152*598139dcSAndroid Build Coastguard Worker #ifndef LOG_FATAL_IF
153*598139dcSAndroid Build Coastguard Worker #define LOG_FATAL_IF(cond, ...) __FAKE_USE_VA_ARGS(__VA_ARGS__)
154*598139dcSAndroid Build Coastguard Worker #endif
155*598139dcSAndroid Build Coastguard Worker #ifndef LOG_FATAL
156*598139dcSAndroid Build Coastguard Worker #define LOG_FATAL(...) __FAKE_USE_VA_ARGS(__VA_ARGS__)
157*598139dcSAndroid Build Coastguard Worker #endif
158*598139dcSAndroid Build Coastguard Worker 
159*598139dcSAndroid Build Coastguard Worker #else
160*598139dcSAndroid Build Coastguard Worker 
161*598139dcSAndroid Build Coastguard Worker #ifndef LOG_FATAL_IF
162*598139dcSAndroid Build Coastguard Worker #define LOG_FATAL_IF(cond, ...) LOG_ALWAYS_FATAL_IF(cond, ##__VA_ARGS__)
163*598139dcSAndroid Build Coastguard Worker #endif
164*598139dcSAndroid Build Coastguard Worker #ifndef LOG_FATAL
165*598139dcSAndroid Build Coastguard Worker #define LOG_FATAL(...) LOG_ALWAYS_FATAL(__VA_ARGS__)
166*598139dcSAndroid Build Coastguard Worker #endif
167*598139dcSAndroid Build Coastguard Worker 
168*598139dcSAndroid Build Coastguard Worker #endif
169*598139dcSAndroid Build Coastguard Worker 
170*598139dcSAndroid Build Coastguard Worker /*
171*598139dcSAndroid Build Coastguard Worker  * Assertion that generates a log message when the assertion fails.
172*598139dcSAndroid Build Coastguard Worker  * Stripped out of release builds.  Uses the current LOG_TAG.
173*598139dcSAndroid Build Coastguard Worker  */
174*598139dcSAndroid Build Coastguard Worker #ifndef ALOG_ASSERT
175*598139dcSAndroid Build Coastguard Worker #define ALOG_ASSERT(cond, ...) LOG_FATAL_IF(!(cond), ##__VA_ARGS__)
176*598139dcSAndroid Build Coastguard Worker #endif
177*598139dcSAndroid Build Coastguard Worker 
178*598139dcSAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
179*598139dcSAndroid Build Coastguard Worker 
180*598139dcSAndroid Build Coastguard Worker /*
181*598139dcSAndroid Build Coastguard Worker  * C/C++ logging functions.  See the logging documentation for API details.
182*598139dcSAndroid Build Coastguard Worker  *
183*598139dcSAndroid Build Coastguard Worker  * We'd like these to be available from C code (in case we import some from
184*598139dcSAndroid Build Coastguard Worker  * somewhere), so this has a C interface.
185*598139dcSAndroid Build Coastguard Worker  *
186*598139dcSAndroid Build Coastguard Worker  * The output will be correct when the log file is shared between multiple
187*598139dcSAndroid Build Coastguard Worker  * threads and/or multiple processes so long as the operating system
188*598139dcSAndroid Build Coastguard Worker  * supports O_APPEND.  These calls have mutex-protected data structures
189*598139dcSAndroid Build Coastguard Worker  * and so are NOT reentrant.  Do not use LOG in a signal handler.
190*598139dcSAndroid Build Coastguard Worker  */
191*598139dcSAndroid Build Coastguard Worker 
192*598139dcSAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
193*598139dcSAndroid Build Coastguard Worker 
194*598139dcSAndroid Build Coastguard Worker /*
195*598139dcSAndroid Build Coastguard Worker  * Simplified macro to send a verbose log message using the current LOG_TAG.
196*598139dcSAndroid Build Coastguard Worker  */
197*598139dcSAndroid Build Coastguard Worker #ifndef ALOGV
198*598139dcSAndroid Build Coastguard Worker #define __ALOGV(...) ((void)ALOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__))
199*598139dcSAndroid Build Coastguard Worker #if LOG_NDEBUG
200*598139dcSAndroid Build Coastguard Worker #define ALOGV(...)                   \
201*598139dcSAndroid Build Coastguard Worker   do {                               \
202*598139dcSAndroid Build Coastguard Worker     __FAKE_USE_VA_ARGS(__VA_ARGS__); \
203*598139dcSAndroid Build Coastguard Worker     if (false) {                     \
204*598139dcSAndroid Build Coastguard Worker       __ALOGV(__VA_ARGS__);          \
205*598139dcSAndroid Build Coastguard Worker     }                                \
206*598139dcSAndroid Build Coastguard Worker   } while (false)
207*598139dcSAndroid Build Coastguard Worker #else
208*598139dcSAndroid Build Coastguard Worker #define ALOGV(...) __ALOGV(__VA_ARGS__)
209*598139dcSAndroid Build Coastguard Worker #endif
210*598139dcSAndroid Build Coastguard Worker #endif
211*598139dcSAndroid Build Coastguard Worker 
212*598139dcSAndroid Build Coastguard Worker #ifndef ALOGV_IF
213*598139dcSAndroid Build Coastguard Worker #if LOG_NDEBUG
214*598139dcSAndroid Build Coastguard Worker #define ALOGV_IF(cond, ...) __FAKE_USE_VA_ARGS(__VA_ARGS__)
215*598139dcSAndroid Build Coastguard Worker #else
216*598139dcSAndroid Build Coastguard Worker #define ALOGV_IF(cond, ...)                                                               \
217*598139dcSAndroid Build Coastguard Worker   ((__predict_false(cond))                                                                \
218*598139dcSAndroid Build Coastguard Worker        ? (__FAKE_USE_VA_ARGS(__VA_ARGS__), (void)ALOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__)) \
219*598139dcSAndroid Build Coastguard Worker        : ((void)0))
220*598139dcSAndroid Build Coastguard Worker #endif
221*598139dcSAndroid Build Coastguard Worker #endif
222*598139dcSAndroid Build Coastguard Worker 
223*598139dcSAndroid Build Coastguard Worker /*
224*598139dcSAndroid Build Coastguard Worker  * Simplified macro to send a debug log message using the current LOG_TAG.
225*598139dcSAndroid Build Coastguard Worker  */
226*598139dcSAndroid Build Coastguard Worker #ifndef ALOGD
227*598139dcSAndroid Build Coastguard Worker #define ALOGD(...) ((void)ALOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__))
228*598139dcSAndroid Build Coastguard Worker #endif
229*598139dcSAndroid Build Coastguard Worker 
230*598139dcSAndroid Build Coastguard Worker #ifndef ALOGD_IF
231*598139dcSAndroid Build Coastguard Worker #define ALOGD_IF(cond, ...)                                                             \
232*598139dcSAndroid Build Coastguard Worker   ((__predict_false(cond))                                                              \
233*598139dcSAndroid Build Coastguard Worker        ? (__FAKE_USE_VA_ARGS(__VA_ARGS__), (void)ALOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__)) \
234*598139dcSAndroid Build Coastguard Worker        : ((void)0))
235*598139dcSAndroid Build Coastguard Worker #endif
236*598139dcSAndroid Build Coastguard Worker 
237*598139dcSAndroid Build Coastguard Worker /*
238*598139dcSAndroid Build Coastguard Worker  * Simplified macro to send an info log message using the current LOG_TAG.
239*598139dcSAndroid Build Coastguard Worker  */
240*598139dcSAndroid Build Coastguard Worker #ifndef ALOGI
241*598139dcSAndroid Build Coastguard Worker #define ALOGI(...) ((void)ALOG(LOG_INFO, LOG_TAG, __VA_ARGS__))
242*598139dcSAndroid Build Coastguard Worker #endif
243*598139dcSAndroid Build Coastguard Worker 
244*598139dcSAndroid Build Coastguard Worker #ifndef ALOGI_IF
245*598139dcSAndroid Build Coastguard Worker #define ALOGI_IF(cond, ...)                                                            \
246*598139dcSAndroid Build Coastguard Worker   ((__predict_false(cond))                                                             \
247*598139dcSAndroid Build Coastguard Worker        ? (__FAKE_USE_VA_ARGS(__VA_ARGS__), (void)ALOG(LOG_INFO, LOG_TAG, __VA_ARGS__)) \
248*598139dcSAndroid Build Coastguard Worker        : ((void)0))
249*598139dcSAndroid Build Coastguard Worker #endif
250*598139dcSAndroid Build Coastguard Worker 
251*598139dcSAndroid Build Coastguard Worker /*
252*598139dcSAndroid Build Coastguard Worker  * Simplified macro to send a warning log message using the current LOG_TAG.
253*598139dcSAndroid Build Coastguard Worker  */
254*598139dcSAndroid Build Coastguard Worker #ifndef ALOGW
255*598139dcSAndroid Build Coastguard Worker #define ALOGW(...) ((void)ALOG(LOG_WARN, LOG_TAG, __VA_ARGS__))
256*598139dcSAndroid Build Coastguard Worker #endif
257*598139dcSAndroid Build Coastguard Worker 
258*598139dcSAndroid Build Coastguard Worker #ifndef ALOGW_IF
259*598139dcSAndroid Build Coastguard Worker #define ALOGW_IF(cond, ...)                                                            \
260*598139dcSAndroid Build Coastguard Worker   ((__predict_false(cond))                                                             \
261*598139dcSAndroid Build Coastguard Worker        ? (__FAKE_USE_VA_ARGS(__VA_ARGS__), (void)ALOG(LOG_WARN, LOG_TAG, __VA_ARGS__)) \
262*598139dcSAndroid Build Coastguard Worker        : ((void)0))
263*598139dcSAndroid Build Coastguard Worker #endif
264*598139dcSAndroid Build Coastguard Worker 
265*598139dcSAndroid Build Coastguard Worker /*
266*598139dcSAndroid Build Coastguard Worker  * Simplified macro to send an error log message using the current LOG_TAG.
267*598139dcSAndroid Build Coastguard Worker  */
268*598139dcSAndroid Build Coastguard Worker #ifndef ALOGE
269*598139dcSAndroid Build Coastguard Worker #define ALOGE(...) ((void)ALOG(LOG_ERROR, LOG_TAG, __VA_ARGS__))
270*598139dcSAndroid Build Coastguard Worker #endif
271*598139dcSAndroid Build Coastguard Worker 
272*598139dcSAndroid Build Coastguard Worker #ifndef ALOGE_IF
273*598139dcSAndroid Build Coastguard Worker #define ALOGE_IF(cond, ...)                                                             \
274*598139dcSAndroid Build Coastguard Worker   ((__predict_false(cond))                                                              \
275*598139dcSAndroid Build Coastguard Worker        ? (__FAKE_USE_VA_ARGS(__VA_ARGS__), (void)ALOG(LOG_ERROR, LOG_TAG, __VA_ARGS__)) \
276*598139dcSAndroid Build Coastguard Worker        : ((void)0))
277*598139dcSAndroid Build Coastguard Worker #endif
278*598139dcSAndroid Build Coastguard Worker 
279*598139dcSAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
280*598139dcSAndroid Build Coastguard Worker 
281*598139dcSAndroid Build Coastguard Worker /*
282*598139dcSAndroid Build Coastguard Worker  * Conditional based on whether the current LOG_TAG is enabled at
283*598139dcSAndroid Build Coastguard Worker  * verbose priority.
284*598139dcSAndroid Build Coastguard Worker  */
285*598139dcSAndroid Build Coastguard Worker #ifndef IF_ALOGV
286*598139dcSAndroid Build Coastguard Worker #if LOG_NDEBUG
287*598139dcSAndroid Build Coastguard Worker #define IF_ALOGV() if (false)
288*598139dcSAndroid Build Coastguard Worker #else
289*598139dcSAndroid Build Coastguard Worker #define IF_ALOGV() IF_ALOG(LOG_VERBOSE, LOG_TAG)
290*598139dcSAndroid Build Coastguard Worker #endif
291*598139dcSAndroid Build Coastguard Worker #endif
292*598139dcSAndroid Build Coastguard Worker 
293*598139dcSAndroid Build Coastguard Worker /*
294*598139dcSAndroid Build Coastguard Worker  * Conditional based on whether the current LOG_TAG is enabled at
295*598139dcSAndroid Build Coastguard Worker  * debug priority.
296*598139dcSAndroid Build Coastguard Worker  */
297*598139dcSAndroid Build Coastguard Worker #ifndef IF_ALOGD
298*598139dcSAndroid Build Coastguard Worker #define IF_ALOGD() IF_ALOG(LOG_DEBUG, LOG_TAG)
299*598139dcSAndroid Build Coastguard Worker #endif
300*598139dcSAndroid Build Coastguard Worker 
301*598139dcSAndroid Build Coastguard Worker /*
302*598139dcSAndroid Build Coastguard Worker  * Conditional based on whether the current LOG_TAG is enabled at
303*598139dcSAndroid Build Coastguard Worker  * info priority.
304*598139dcSAndroid Build Coastguard Worker  */
305*598139dcSAndroid Build Coastguard Worker #ifndef IF_ALOGI
306*598139dcSAndroid Build Coastguard Worker #define IF_ALOGI() IF_ALOG(LOG_INFO, LOG_TAG)
307*598139dcSAndroid Build Coastguard Worker #endif
308*598139dcSAndroid Build Coastguard Worker 
309*598139dcSAndroid Build Coastguard Worker /*
310*598139dcSAndroid Build Coastguard Worker  * Conditional based on whether the current LOG_TAG is enabled at
311*598139dcSAndroid Build Coastguard Worker  * warn priority.
312*598139dcSAndroid Build Coastguard Worker  */
313*598139dcSAndroid Build Coastguard Worker #ifndef IF_ALOGW
314*598139dcSAndroid Build Coastguard Worker #define IF_ALOGW() IF_ALOG(LOG_WARN, LOG_TAG)
315*598139dcSAndroid Build Coastguard Worker #endif
316*598139dcSAndroid Build Coastguard Worker 
317*598139dcSAndroid Build Coastguard Worker /*
318*598139dcSAndroid Build Coastguard Worker  * Conditional based on whether the current LOG_TAG is enabled at
319*598139dcSAndroid Build Coastguard Worker  * error priority.
320*598139dcSAndroid Build Coastguard Worker  */
321*598139dcSAndroid Build Coastguard Worker #ifndef IF_ALOGE
322*598139dcSAndroid Build Coastguard Worker #define IF_ALOGE() IF_ALOG(LOG_ERROR, LOG_TAG)
323*598139dcSAndroid Build Coastguard Worker #endif
324*598139dcSAndroid Build Coastguard Worker 
325*598139dcSAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
326*598139dcSAndroid Build Coastguard Worker 
327*598139dcSAndroid Build Coastguard Worker /*
328*598139dcSAndroid Build Coastguard Worker  * Basic log message macro.
329*598139dcSAndroid Build Coastguard Worker  *
330*598139dcSAndroid Build Coastguard Worker  * Example:
331*598139dcSAndroid Build Coastguard Worker  *  ALOG(LOG_WARN, NULL, "Failed with error %d", errno);
332*598139dcSAndroid Build Coastguard Worker  *
333*598139dcSAndroid Build Coastguard Worker  * The second argument may be NULL or "" to indicate the "global" tag.
334*598139dcSAndroid Build Coastguard Worker  */
335*598139dcSAndroid Build Coastguard Worker #ifndef ALOG
336*598139dcSAndroid Build Coastguard Worker #define ALOG(priority, tag, ...) LOG_PRI(ANDROID_##priority, tag, __VA_ARGS__)
337*598139dcSAndroid Build Coastguard Worker #endif
338*598139dcSAndroid Build Coastguard Worker 
339*598139dcSAndroid Build Coastguard Worker /*
340*598139dcSAndroid Build Coastguard Worker  * Conditional given a desired logging priority and tag.
341*598139dcSAndroid Build Coastguard Worker  */
342*598139dcSAndroid Build Coastguard Worker #ifndef IF_ALOG
343*598139dcSAndroid Build Coastguard Worker #define IF_ALOG(priority, tag) if (android_testLog(ANDROID_##priority, tag))
344*598139dcSAndroid Build Coastguard Worker #endif
345*598139dcSAndroid Build Coastguard Worker 
346*598139dcSAndroid Build Coastguard Worker /* --------------------------------------------------------------------- */
347*598139dcSAndroid Build Coastguard Worker 
348*598139dcSAndroid Build Coastguard Worker /*
349*598139dcSAndroid Build Coastguard Worker  *    IF_ALOG uses android_testLog, but IF_ALOG can be overridden.
350*598139dcSAndroid Build Coastguard Worker  *    android_testLog will remain constant in its purpose as a wrapper
351*598139dcSAndroid Build Coastguard Worker  *        for Android logging filter policy, and can be subject to
352*598139dcSAndroid Build Coastguard Worker  *        change. It can be reused by the developers that override
353*598139dcSAndroid Build Coastguard Worker  *        IF_ALOG as a convenient means to reimplement their policy
354*598139dcSAndroid Build Coastguard Worker  *        over Android.
355*598139dcSAndroid Build Coastguard Worker  */
356*598139dcSAndroid Build Coastguard Worker 
357*598139dcSAndroid Build Coastguard Worker #if LOG_NDEBUG /* Production */
358*598139dcSAndroid Build Coastguard Worker #define android_testLog(prio, tag) \
359*598139dcSAndroid Build Coastguard Worker   (__android_log_is_loggable_len(prio, tag, (tag) ? strlen(tag) : 0, ANDROID_LOG_DEBUG) != 0)
360*598139dcSAndroid Build Coastguard Worker #else
361*598139dcSAndroid Build Coastguard Worker #define android_testLog(prio, tag) \
362*598139dcSAndroid Build Coastguard Worker   (__android_log_is_loggable_len(prio, tag, (tag) ? strlen(tag) : 0, ANDROID_LOG_VERBOSE) != 0)
363*598139dcSAndroid Build Coastguard Worker #endif
364*598139dcSAndroid Build Coastguard Worker 
365*598139dcSAndroid Build Coastguard Worker #if defined(__clang__)
366*598139dcSAndroid Build Coastguard Worker #pragma clang diagnostic pop
367*598139dcSAndroid Build Coastguard Worker #endif
368*598139dcSAndroid Build Coastguard Worker 
369*598139dcSAndroid Build Coastguard Worker __END_DECLS
370