1ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner/*
25c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * Copyright (C) 2005-2017 The Android Open Source Project
3ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner *
4ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner * Licensed under the Apache License, Version 2.0 (the "License");
5ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner * you may not use this file except in compliance with the License.
6ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner * You may obtain a copy of the License at
7ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner *
8ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner *      http://www.apache.org/licenses/LICENSE-2.0
9ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner *
10ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner * Unless required by applicable law or agreed to in writing, software
11ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner * distributed under the License is distributed on an "AS IS" BASIS,
12ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner * See the License for the specific language governing permissions and
14ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner * limitations under the License.
15ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner */
16ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner
175c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#ifndef _LIBS_LOG_LOG_MAIN_H
185c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#define _LIBS_LOG_LOG_MAIN_H
19ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner
205c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#include <android/log.h>
2179b1a3027b4c1b5f86a68c7a5bf1f1d2e22494d8Yifan Hong#include <sys/cdefs.h>
22ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner
2379b1a3027b4c1b5f86a68c7a5bf1f1d2e22494d8Yifan Hong__BEGIN_DECLS
24ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner
25ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner/*
26749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * Normally we strip the effects of ALOGV (VERBOSE messages),
27749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * LOG_FATAL and LOG_FATAL_IF (FATAL assert messages) from the
28749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * release builds be defining NDEBUG.  You can modify this (for
29749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * example with "#define LOG_NDEBUG 0" at the top of your source
30749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * file) to change that behavior.
31749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn */
32749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
33749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef LOG_NDEBUG
34749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifdef NDEBUG
35749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define LOG_NDEBUG 1
36749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#else
37749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define LOG_NDEBUG 0
38749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif
39749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif
40749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
415c967da341c9395a4c378c149f326505224ec66eMark Salyzyn/* --------------------------------------------------------------------- */
425c967da341c9395a4c378c149f326505224ec66eMark Salyzyn
43749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/*
445c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * This file uses ", ## __VA_ARGS__" zero-argument token pasting to
455c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * work around issues with debug-only syntax errors in assertions
465c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * that are missing format strings.  See commit
475c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * 19299904343daf191267564fe32e6cd5c165cd42
48ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner */
495c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#if defined(__clang__)
505c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#pragma clang diagnostic push
515c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments"
52749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif
53df7a4c6bae5f85532d79a93b7d9197a2aab17825Mark Salyzyn
545c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#ifndef __predict_false
555c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#define __predict_false(exp) __builtin_expect((exp) != 0, 0)
565c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#endif
57749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
582ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define android_writeLog(prio, tag, text) __android_log_write(prio, tag, text)
59ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner
60749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define android_printLog(prio, tag, ...) \
612ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  __android_log_print(prio, tag, __VA_ARGS__)
62749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
635c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#define android_vprintLog(prio, cond, tag, ...) \
642ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  __android_log_vprint(prio, tag, __VA_ARGS__)
655c967da341c9395a4c378c149f326505224ec66eMark Salyzyn
66749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/*
67749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * Log macro that allows you to specify a number for the priority.
68749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn */
69749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef LOG_PRI
702ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define LOG_PRI(priority, tag, ...) android_printLog(priority, tag, __VA_ARGS__)
71749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif
72749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
73ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner/*
74749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * Log macro that allows you to pass in a varargs ("args" is a va_list).
75749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn */
76749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef LOG_PRI_VA
77749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define LOG_PRI_VA(priority, tag, fmt, args) \
782ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  android_vprintLog(priority, NULL, tag, fmt, args)
79749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif
80ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner
815c967da341c9395a4c378c149f326505224ec66eMark Salyzyn/* --------------------------------------------------------------------- */
82ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner
83749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/* XXX Macros to work around syntax errors in places where format string
84749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * arg is not passed to ALOG_ASSERT, LOG_ALWAYS_FATAL or LOG_ALWAYS_FATAL_IF
85749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * (happens only in debug builds).
86749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn */
876584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
88749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/* Returns 2nd arg.  Used to substitute default value if caller's vararg list
89749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * is empty.
90749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn */
912ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define __android_second(dummy, second, ...) second
92749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
93749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/* If passed multiple args, returns ',' followed by all but 1st arg, otherwise
94749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * returns nothing.
95749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn */
962ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define __android_rest(first, ...) , ##__VA_ARGS__
976584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
982ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define android_printAssert(cond, tag, ...)                     \
992ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  __android_log_assert(cond, tag,                               \
1002ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn                       __android_second(0, ##__VA_ARGS__, NULL) \
1012ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn                           __android_rest(__VA_ARGS__))
1026584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
1036584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
104749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * Log a fatal error.  If the given condition fails, this stops program
105749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * execution like a normal assertion, but also generating the given message.
106749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * It is NOT stripped from release builds.  Note that the condition test
107749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * is -inverted- from the normal assert() semantics.
1086584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
109749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef LOG_ALWAYS_FATAL_IF
1102ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define LOG_ALWAYS_FATAL_IF(cond, ...)                              \
1112ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ((__predict_false(cond))                                          \
1122ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn       ? ((void)android_printAssert(#cond, LOG_TAG, ##__VA_ARGS__)) \
1132ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn       : (void)0)
1146584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
115749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
116749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef LOG_ALWAYS_FATAL
117749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define LOG_ALWAYS_FATAL(...) \
1182ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  (((void)android_printAssert(NULL, LOG_TAG, ##__VA_ARGS__)))
1196584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
1206584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
1216584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
122749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * Versions of LOG_ALWAYS_FATAL_IF and LOG_ALWAYS_FATAL that
123749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * are stripped out of release builds.
1246584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
125749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
126749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#if LOG_NDEBUG
127749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
128749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef LOG_FATAL_IF
129749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define LOG_FATAL_IF(cond, ...) ((void)0)
130749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif
131749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef LOG_FATAL
132749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define LOG_FATAL(...) ((void)0)
1336584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
1346584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
135749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#else
1366584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
137749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef LOG_FATAL_IF
1382ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define LOG_FATAL_IF(cond, ...) LOG_ALWAYS_FATAL_IF(cond, ##__VA_ARGS__)
139749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif
140749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef LOG_FATAL
141749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define LOG_FATAL(...) LOG_ALWAYS_FATAL(__VA_ARGS__)
1426584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
1436584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
144749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif
145749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
146749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/*
147749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * Assertion that generates a log message when the assertion fails.
148749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * Stripped out of release builds.  Uses the current LOG_TAG.
149749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn */
150749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef ALOG_ASSERT
1512ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ALOG_ASSERT(cond, ...) LOG_FATAL_IF(!(cond), ##__VA_ARGS__)
152749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif
153749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
154749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/* --------------------------------------------------------------------- */
155749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
1566584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
157749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * C/C++ logging functions.  See the logging documentation for API details.
158749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn *
159749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * We'd like these to be available from C code (in case we import some from
160749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * somewhere), so this has a C interface.
161749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn *
162749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * The output will be correct when the log file is shared between multiple
163749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * threads and/or multiple processes so long as the operating system
164749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * supports O_APPEND.  These calls have mutex-protected data structures
165749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * and so are NOT reentrant.  Do not use LOG in a signal handler.
166749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn */
167749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
168749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/* --------------------------------------------------------------------- */
1696584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
1706584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
1716584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Simplified macro to send a verbose log message using the current LOG_TAG.
1726584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
1736584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef ALOGV
1746584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#define __ALOGV(...) ((void)ALOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__))
1756584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#if LOG_NDEBUG
1762ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ALOGV(...)          \
1772ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  do {                      \
1782ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    if (0) {                \
1792ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn      __ALOGV(__VA_ARGS__); \
1802ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    }                       \
1812ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  } while (0)
1826584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#else
1836584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#define ALOGV(...) __ALOGV(__VA_ARGS__)
1846584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
1856584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
1866584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
1876584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef ALOGV_IF
1886584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#if LOG_NDEBUG
1892ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ALOGV_IF(cond, ...) ((void)0)
1906584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#else
1912ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ALOGV_IF(cond, ...)                                                  \
1922ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ((__predict_false(cond)) ? ((void)ALOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__)) \
1932ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn                           : (void)0)
1946584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
1956584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
1966584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
1976584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
1986584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Simplified macro to send a debug log message using the current LOG_TAG.
1996584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
2006584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef ALOGD
2016584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#define ALOGD(...) ((void)ALOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__))
2026584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2036584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2046584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef ALOGD_IF
2052ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ALOGD_IF(cond, ...)                                                \
2062ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ((__predict_false(cond)) ? ((void)ALOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__)) \
2072ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn                           : (void)0)
2086584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2096584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2106584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
2116584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Simplified macro to send an info log message using the current LOG_TAG.
2126584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
2136584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef ALOGI
2146584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#define ALOGI(...) ((void)ALOG(LOG_INFO, LOG_TAG, __VA_ARGS__))
2156584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2166584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2176584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef ALOGI_IF
2182ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ALOGI_IF(cond, ...)                                               \
2192ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ((__predict_false(cond)) ? ((void)ALOG(LOG_INFO, LOG_TAG, __VA_ARGS__)) \
2202ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn                           : (void)0)
2216584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2226584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2236584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
2246584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Simplified macro to send a warning log message using the current LOG_TAG.
2256584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
2266584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef ALOGW
2276584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#define ALOGW(...) ((void)ALOG(LOG_WARN, LOG_TAG, __VA_ARGS__))
2286584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2296584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2306584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef ALOGW_IF
2312ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ALOGW_IF(cond, ...)                                               \
2322ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ((__predict_false(cond)) ? ((void)ALOG(LOG_WARN, LOG_TAG, __VA_ARGS__)) \
2332ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn                           : (void)0)
2346584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2356584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2366584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
2376584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Simplified macro to send an error log message using the current LOG_TAG.
2386584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
2396584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef ALOGE
2406584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#define ALOGE(...) ((void)ALOG(LOG_ERROR, LOG_TAG, __VA_ARGS__))
2416584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2426584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2436584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef ALOGE_IF
2442ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ALOGE_IF(cond, ...)                                                \
2452ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ((__predict_false(cond)) ? ((void)ALOG(LOG_ERROR, LOG_TAG, __VA_ARGS__)) \
2462ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn                           : (void)0)
2476584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2486584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
249749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/* --------------------------------------------------------------------- */
2506584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2516584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
2526584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Conditional based on whether the current LOG_TAG is enabled at
2536584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * verbose priority.
2546584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
2556584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef IF_ALOGV
2566584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#if LOG_NDEBUG
2576584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#define IF_ALOGV() if (false)
2586584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#else
2596584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#define IF_ALOGV() IF_ALOG(LOG_VERBOSE, LOG_TAG)
2606584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2616584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2626584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2636584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
2646584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Conditional based on whether the current LOG_TAG is enabled at
2656584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * debug priority.
2666584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
2676584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef IF_ALOGD
2686584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#define IF_ALOGD() IF_ALOG(LOG_DEBUG, LOG_TAG)
2696584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2706584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2716584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
2726584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Conditional based on whether the current LOG_TAG is enabled at
2736584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * info priority.
2746584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
2756584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef IF_ALOGI
2766584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#define IF_ALOGI() IF_ALOG(LOG_INFO, LOG_TAG)
2776584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2786584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2796584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
2806584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Conditional based on whether the current LOG_TAG is enabled at
2816584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * warn priority.
2826584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
2836584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef IF_ALOGW
2846584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#define IF_ALOGW() IF_ALOG(LOG_WARN, LOG_TAG)
2856584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2866584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2876584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
2886584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Conditional based on whether the current LOG_TAG is enabled at
2896584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * error priority.
2906584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
2916584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef IF_ALOGE
2926584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#define IF_ALOGE() IF_ALOG(LOG_ERROR, LOG_TAG)
2936584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2946584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
295749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/* --------------------------------------------------------------------- */
2966584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2976584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
2986584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Basic log message macro.
2996584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn *
3006584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Example:
3016584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn *  ALOG(LOG_WARN, NULL, "Failed with error %d", errno);
3026584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn *
3036584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * The second argument may be NULL or "" to indicate the "global" tag.
3046584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
3056584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef ALOG
3062ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ALOG(priority, tag, ...) LOG_PRI(ANDROID_##priority, tag, __VA_ARGS__)
3076584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
3086584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
3096584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
3106584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Conditional given a desired logging priority and tag.
3116584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
3126584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef IF_ALOG
3132ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define IF_ALOG(priority, tag) if (android_testLog(ANDROID_##priority, tag))
3146584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
3156584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
316749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/* --------------------------------------------------------------------- */
3176584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
3186584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
319749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn *    IF_ALOG uses android_testLog, but IF_ALOG can be overridden.
320749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn *    android_testLog will remain constant in its purpose as a wrapper
321749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn *        for Android logging filter policy, and can be subject to
322749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn *        change. It can be reused by the developers that override
323749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn *        IF_ALOG as a convenient means to reimplement their policy
324749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn *        over Android.
3256584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
3266584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
327749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef __ANDROID_USE_LIBLOG_LOGGABLE_INTERFACE
328749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef __ANDROID_API__
329749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define __ANDROID_USE_LIBLOG_LOGGABLE_INTERFACE 2
330749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#elif __ANDROID_API__ > 24 /* > Nougat */
331749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define __ANDROID_USE_LIBLOG_LOGGABLE_INTERFACE 2
332749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#elif __ANDROID_API__ > 22 /* > Lollipop */
333749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define __ANDROID_USE_LIBLOG_LOGGABLE_INTERFACE 1
334749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#else
335749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define __ANDROID_USE_LIBLOG_LOGGABLE_INTERFACE 0
336749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif
337749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif
3386584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
339749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#if __ANDROID_USE_LIBLOG_LOGGABLE_INTERFACE
3406584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
3416584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
342749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * Use the per-tag properties "log.tag.<tagname>" to generate a runtime
343749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * result of non-zero to expose a log. prio is ANDROID_LOG_VERBOSE to
344749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * ANDROID_LOG_FATAL. default_prio if no property. Undefined behavior if
345749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * any other value.
3466584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
347749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzynint __android_log_is_loggable(int prio, const char* tag, int default_prio);
3486584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
349749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#if __ANDROID_USE_LIBLOG_LOGGABLE_INTERFACE > 1
350749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#include <sys/types.h>
3516584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
352749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzynint __android_log_is_loggable_len(int prio, const char* tag, size_t len,
353749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn                                  int default_prio);
3546584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
3556584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#if LOG_NDEBUG /* Production */
3562ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define android_testLog(prio, tag)                                           \
3572ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  (__android_log_is_loggable_len(prio, tag, (tag && *tag) ? strlen(tag) : 0, \
3582ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn                                 ANDROID_LOG_DEBUG) != 0)
3596584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#else
3602ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define android_testLog(prio, tag)                                           \
3612ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  (__android_log_is_loggable_len(prio, tag, (tag && *tag) ? strlen(tag) : 0, \
3622ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn                                 ANDROID_LOG_VERBOSE) != 0)
3636584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
3646584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
365749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#else
3666584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
367749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#if LOG_NDEBUG /* Production */
368749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define android_testLog(prio, tag) \
3692ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  (__android_log_is_loggable(prio, tag, ANDROID_LOG_DEBUG) != 0)
370749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#else
371749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define android_testLog(prio, tag) \
3722ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  (__android_log_is_loggable(prio, tag, ANDROID_LOG_VERBOSE) != 0)
373749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif
3746584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
3756584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
376749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
377749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#else /* __ANDROID_USE_LIBLOG_LOGGABLE_INTERFACE */
378749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
379749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define android_testLog(prio, tag) (1)
380749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
381749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif /* !__ANDROID_USE_LIBLOG_LOGGABLE_INTERFACE */
3826584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
3836584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#if defined(__clang__)
3846584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#pragma clang diagnostic pop
3856584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
3866584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
38779b1a3027b4c1b5f86a68c7a5bf1f1d2e22494d8Yifan Hong__END_DECLS
388ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner
3895c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#endif /* _LIBS_LOG_LOG_MAIN_H */
390