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