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
20b0e17c9e91bd51a129933e46ef1b68e57bb4b5f3Krzysztof Wesolowski#include <stdbool.h>
21b0e17c9e91bd51a129933e46ef1b68e57bb4b5f3Krzysztof Wesolowski
225c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#include <android/log.h>
23e2c51809f70387a6ceddc89966b48aaee17ac402Yifan Hong#include <sys/cdefs.h>
24ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner
25e2c51809f70387a6ceddc89966b48aaee17ac402Yifan Hong__BEGIN_DECLS
26ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner
27ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner/*
28749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * Normally we strip the effects of ALOGV (VERBOSE messages),
29749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * LOG_FATAL and LOG_FATAL_IF (FATAL assert messages) from the
30749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * release builds be defining NDEBUG.  You can modify this (for
31749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * example with "#define LOG_NDEBUG 0" at the top of your source
32749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * file) to change that behavior.
33749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn */
34749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
35749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef LOG_NDEBUG
36749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifdef NDEBUG
37749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define LOG_NDEBUG 1
38749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#else
39749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define LOG_NDEBUG 0
40749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif
41749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif
42749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
435c967da341c9395a4c378c149f326505224ec66eMark Salyzyn/* --------------------------------------------------------------------- */
445c967da341c9395a4c378c149f326505224ec66eMark Salyzyn
45749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/*
465c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * This file uses ", ## __VA_ARGS__" zero-argument token pasting to
475c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * work around issues with debug-only syntax errors in assertions
485c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * that are missing format strings.  See commit
495c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * 19299904343daf191267564fe32e6cd5c165cd42
50ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner */
515c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#if defined(__clang__)
525c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#pragma clang diagnostic push
535c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments"
54749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif
55df7a4c6bae5f85532d79a93b7d9197a2aab17825Mark Salyzyn
565c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#ifndef __predict_false
575c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#define __predict_false(exp) __builtin_expect((exp) != 0, 0)
585c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#endif
59749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
602ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define android_writeLog(prio, tag, text) __android_log_write(prio, tag, text)
61ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner
62749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define android_printLog(prio, tag, ...) \
632ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  __android_log_print(prio, tag, __VA_ARGS__)
64749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
655c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#define android_vprintLog(prio, cond, tag, ...) \
662ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  __android_log_vprint(prio, tag, __VA_ARGS__)
675c967da341c9395a4c378c149f326505224ec66eMark Salyzyn
68749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/*
69749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * Log macro that allows you to specify a number for the priority.
70749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn */
71749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef LOG_PRI
722ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define LOG_PRI(priority, tag, ...) android_printLog(priority, tag, __VA_ARGS__)
73749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif
74749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
75ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner/*
76749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * Log macro that allows you to pass in a varargs ("args" is a va_list).
77749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn */
78749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef LOG_PRI_VA
79749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define LOG_PRI_VA(priority, tag, fmt, args) \
802ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  android_vprintLog(priority, NULL, tag, fmt, args)
81749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif
82ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner
835c967da341c9395a4c378c149f326505224ec66eMark Salyzyn/* --------------------------------------------------------------------- */
84ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner
85749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/* XXX Macros to work around syntax errors in places where format string
86749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * arg is not passed to ALOG_ASSERT, LOG_ALWAYS_FATAL or LOG_ALWAYS_FATAL_IF
87749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * (happens only in debug builds).
88749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn */
896584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
90749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/* Returns 2nd arg.  Used to substitute default value if caller's vararg list
91749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * is empty.
92749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn */
932ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define __android_second(dummy, second, ...) second
94749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
95749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/* If passed multiple args, returns ',' followed by all but 1st arg, otherwise
96749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * returns nothing.
97749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn */
982ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define __android_rest(first, ...) , ##__VA_ARGS__
996584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
1002ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define android_printAssert(cond, tag, ...)                     \
1012ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  __android_log_assert(cond, tag,                               \
1022ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn                       __android_second(0, ##__VA_ARGS__, NULL) \
1032ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn                           __android_rest(__VA_ARGS__))
1046584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
1056584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
106749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * Log a fatal error.  If the given condition fails, this stops program
107749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * execution like a normal assertion, but also generating the given message.
108749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * It is NOT stripped from release builds.  Note that the condition test
109749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * is -inverted- from the normal assert() semantics.
1106584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
111749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef LOG_ALWAYS_FATAL_IF
1122ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define LOG_ALWAYS_FATAL_IF(cond, ...)                              \
1132ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ((__predict_false(cond))                                          \
1142ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn       ? ((void)android_printAssert(#cond, LOG_TAG, ##__VA_ARGS__)) \
1152ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn       : (void)0)
1166584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
117749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
118749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef LOG_ALWAYS_FATAL
119749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define LOG_ALWAYS_FATAL(...) \
1202ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  (((void)android_printAssert(NULL, LOG_TAG, ##__VA_ARGS__)))
1216584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
1226584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
1236584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
124749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * Versions of LOG_ALWAYS_FATAL_IF and LOG_ALWAYS_FATAL that
125749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * are stripped out of release builds.
1266584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
127749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
128749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#if LOG_NDEBUG
129749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
130749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef LOG_FATAL_IF
131749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define LOG_FATAL_IF(cond, ...) ((void)0)
132749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif
133749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef LOG_FATAL
134749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define LOG_FATAL(...) ((void)0)
1356584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
1366584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
137749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#else
1386584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
139749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef LOG_FATAL_IF
1402ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define LOG_FATAL_IF(cond, ...) LOG_ALWAYS_FATAL_IF(cond, ##__VA_ARGS__)
141749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif
142749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef LOG_FATAL
143749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define LOG_FATAL(...) LOG_ALWAYS_FATAL(__VA_ARGS__)
1446584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
1456584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
146749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif
147749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
148749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/*
149749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * Assertion that generates a log message when the assertion fails.
150749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * Stripped out of release builds.  Uses the current LOG_TAG.
151749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn */
152749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef ALOG_ASSERT
1532ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ALOG_ASSERT(cond, ...) LOG_FATAL_IF(!(cond), ##__VA_ARGS__)
154749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif
155749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
156749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/* --------------------------------------------------------------------- */
157749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
1586584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
159749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * C/C++ logging functions.  See the logging documentation for API details.
160749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn *
161749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * We'd like these to be available from C code (in case we import some from
162749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * somewhere), so this has a C interface.
163749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn *
164749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * The output will be correct when the log file is shared between multiple
165749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * threads and/or multiple processes so long as the operating system
166749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * supports O_APPEND.  These calls have mutex-protected data structures
167749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * and so are NOT reentrant.  Do not use LOG in a signal handler.
168749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn */
169749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
170749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/* --------------------------------------------------------------------- */
1716584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
1726584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
1736584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Simplified macro to send a verbose log message using the current LOG_TAG.
1746584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
1756584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef ALOGV
1766584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#define __ALOGV(...) ((void)ALOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__))
1776584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#if LOG_NDEBUG
1782ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ALOGV(...)          \
1792ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  do {                      \
180b0e17c9e91bd51a129933e46ef1b68e57bb4b5f3Krzysztof Wesolowski    if (false) {            \
1812ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn      __ALOGV(__VA_ARGS__); \
1822ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    }                       \
183b0e17c9e91bd51a129933e46ef1b68e57bb4b5f3Krzysztof Wesolowski  } while (false)
1846584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#else
1856584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#define ALOGV(...) __ALOGV(__VA_ARGS__)
1866584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
1876584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
1886584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
1896584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef ALOGV_IF
1906584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#if LOG_NDEBUG
1912ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ALOGV_IF(cond, ...) ((void)0)
1926584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#else
1932ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ALOGV_IF(cond, ...)                                                  \
1942ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ((__predict_false(cond)) ? ((void)ALOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__)) \
1952ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn                           : (void)0)
1966584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
1976584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
1986584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
1996584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
2006584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Simplified macro to send a debug log message using the current LOG_TAG.
2016584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
2026584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef ALOGD
2036584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#define ALOGD(...) ((void)ALOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__))
2046584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2056584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2066584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef ALOGD_IF
2072ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ALOGD_IF(cond, ...)                                                \
2082ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ((__predict_false(cond)) ? ((void)ALOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__)) \
2092ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn                           : (void)0)
2106584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2116584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2126584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
2136584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Simplified macro to send an info log message using the current LOG_TAG.
2146584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
2156584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef ALOGI
2166584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#define ALOGI(...) ((void)ALOG(LOG_INFO, LOG_TAG, __VA_ARGS__))
2176584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2186584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2196584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef ALOGI_IF
2202ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ALOGI_IF(cond, ...)                                               \
2212ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ((__predict_false(cond)) ? ((void)ALOG(LOG_INFO, LOG_TAG, __VA_ARGS__)) \
2222ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn                           : (void)0)
2236584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2246584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2256584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
2266584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Simplified macro to send a warning log message using the current LOG_TAG.
2276584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
2286584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef ALOGW
2296584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#define ALOGW(...) ((void)ALOG(LOG_WARN, LOG_TAG, __VA_ARGS__))
2306584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2316584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2326584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef ALOGW_IF
2332ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ALOGW_IF(cond, ...)                                               \
2342ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ((__predict_false(cond)) ? ((void)ALOG(LOG_WARN, LOG_TAG, __VA_ARGS__)) \
2352ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn                           : (void)0)
2366584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2376584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2386584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
2396584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Simplified macro to send an error log message using the current LOG_TAG.
2406584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
2416584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef ALOGE
2426584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#define ALOGE(...) ((void)ALOG(LOG_ERROR, LOG_TAG, __VA_ARGS__))
2436584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2446584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2456584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef ALOGE_IF
2462ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ALOGE_IF(cond, ...)                                                \
2472ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ((__predict_false(cond)) ? ((void)ALOG(LOG_ERROR, LOG_TAG, __VA_ARGS__)) \
2482ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn                           : (void)0)
2496584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2506584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
251749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/* --------------------------------------------------------------------- */
2526584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2536584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
2546584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Conditional based on whether the current LOG_TAG is enabled at
2556584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * verbose priority.
2566584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
2576584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef IF_ALOGV
2586584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#if LOG_NDEBUG
2596584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#define IF_ALOGV() if (false)
2606584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#else
2616584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#define IF_ALOGV() IF_ALOG(LOG_VERBOSE, LOG_TAG)
2626584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2636584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2646584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2656584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
2666584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Conditional based on whether the current LOG_TAG is enabled at
2676584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * debug priority.
2686584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
2696584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef IF_ALOGD
2706584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#define IF_ALOGD() IF_ALOG(LOG_DEBUG, LOG_TAG)
2716584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2726584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2736584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
2746584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Conditional based on whether the current LOG_TAG is enabled at
2756584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * info priority.
2766584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
2776584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef IF_ALOGI
2786584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#define IF_ALOGI() IF_ALOG(LOG_INFO, LOG_TAG)
2796584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2806584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2816584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
2826584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Conditional based on whether the current LOG_TAG is enabled at
2836584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * warn priority.
2846584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
2856584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef IF_ALOGW
2866584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#define IF_ALOGW() IF_ALOG(LOG_WARN, LOG_TAG)
2876584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2886584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2896584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
2906584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Conditional based on whether the current LOG_TAG is enabled at
2916584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * error priority.
2926584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
2936584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef IF_ALOGE
2946584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#define IF_ALOGE() IF_ALOG(LOG_ERROR, LOG_TAG)
2956584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2966584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
297749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/* --------------------------------------------------------------------- */
2986584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2996584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
3006584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Basic log message macro.
3016584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn *
3026584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Example:
3036584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn *  ALOG(LOG_WARN, NULL, "Failed with error %d", errno);
3046584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn *
3056584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * The second argument may be NULL or "" to indicate the "global" tag.
3066584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
3076584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef ALOG
3082ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ALOG(priority, tag, ...) LOG_PRI(ANDROID_##priority, tag, __VA_ARGS__)
3096584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
3106584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
3116584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
3126584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Conditional given a desired logging priority and tag.
3136584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
3146584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef IF_ALOG
3152ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define IF_ALOG(priority, tag) if (android_testLog(ANDROID_##priority, tag))
3166584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
3176584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
318749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/* --------------------------------------------------------------------- */
3196584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
3206584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
321749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn *    IF_ALOG uses android_testLog, but IF_ALOG can be overridden.
322749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn *    android_testLog will remain constant in its purpose as a wrapper
323749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn *        for Android logging filter policy, and can be subject to
324749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn *        change. It can be reused by the developers that override
325749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn *        IF_ALOG as a convenient means to reimplement their policy
326749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn *        over Android.
3276584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
3286584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
329749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef __ANDROID_USE_LIBLOG_LOGGABLE_INTERFACE
330749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef __ANDROID_API__
331749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define __ANDROID_USE_LIBLOG_LOGGABLE_INTERFACE 2
332749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#elif __ANDROID_API__ > 24 /* > Nougat */
333749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define __ANDROID_USE_LIBLOG_LOGGABLE_INTERFACE 2
334749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#elif __ANDROID_API__ > 22 /* > Lollipop */
335749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define __ANDROID_USE_LIBLOG_LOGGABLE_INTERFACE 1
336749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#else
337749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define __ANDROID_USE_LIBLOG_LOGGABLE_INTERFACE 0
338749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif
339749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif
3406584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
341749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#if __ANDROID_USE_LIBLOG_LOGGABLE_INTERFACE
3426584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
3436584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
344749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * Use the per-tag properties "log.tag.<tagname>" to generate a runtime
345749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * result of non-zero to expose a log. prio is ANDROID_LOG_VERBOSE to
346749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * ANDROID_LOG_FATAL. default_prio if no property. Undefined behavior if
347749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * any other value.
3486584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
349749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzynint __android_log_is_loggable(int prio, const char* tag, int default_prio);
3506584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
351749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#if __ANDROID_USE_LIBLOG_LOGGABLE_INTERFACE > 1
352749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#include <sys/types.h>
3536584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
354749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzynint __android_log_is_loggable_len(int prio, const char* tag, size_t len,
355749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn                                  int default_prio);
3566584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
3576584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#if LOG_NDEBUG /* Production */
3582ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define android_testLog(prio, tag)                                           \
35985244e8bc2702f9a46782c5075b832b7c1d96900Chih-Hung Hsieh  (__android_log_is_loggable_len(prio, tag, ((tag) && *(tag)) ? strlen(tag) : 0, \
3602ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn                                 ANDROID_LOG_DEBUG) != 0)
3616584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#else
3622ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define android_testLog(prio, tag)                                           \
36385244e8bc2702f9a46782c5075b832b7c1d96900Chih-Hung Hsieh  (__android_log_is_loggable_len(prio, tag, ((tag) && *(tag)) ? strlen(tag) : 0, \
3642ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn                                 ANDROID_LOG_VERBOSE) != 0)
3656584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
3666584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
367749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#else
3686584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
369749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#if LOG_NDEBUG /* Production */
370749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define android_testLog(prio, tag) \
3712ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  (__android_log_is_loggable(prio, tag, ANDROID_LOG_DEBUG) != 0)
372749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#else
373749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define android_testLog(prio, tag) \
3742ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  (__android_log_is_loggable(prio, tag, ANDROID_LOG_VERBOSE) != 0)
375749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif
3766584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
3776584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
378749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
379749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#else /* __ANDROID_USE_LIBLOG_LOGGABLE_INTERFACE */
380749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
381749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define android_testLog(prio, tag) (1)
382749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
383749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif /* !__ANDROID_USE_LIBLOG_LOGGABLE_INTERFACE */
3846584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
3856584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#if defined(__clang__)
3866584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#pragma clang diagnostic pop
3876584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
3886584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
389e2c51809f70387a6ceddc89966b48aaee17ac402Yifan Hong__END_DECLS
390ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner
3915c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#endif /* _LIBS_LOG_LOG_MAIN_H */
392