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>
21ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner
22ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner#ifdef __cplusplus
23ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turnerextern "C" {
24ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner#endif
25ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner
26ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner/*
27749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * Normally we strip the effects of ALOGV (VERBOSE messages),
28749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * LOG_FATAL and LOG_FATAL_IF (FATAL assert messages) from the
29749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * release builds be defining NDEBUG.  You can modify this (for
30749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * example with "#define LOG_NDEBUG 0" at the top of your source
31749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * file) to change that behavior.
32749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn */
33749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
34749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef LOG_NDEBUG
35749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifdef NDEBUG
36749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define LOG_NDEBUG 1
37749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#else
38749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define LOG_NDEBUG 0
39749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif
40749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif
41749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
425c967da341c9395a4c378c149f326505224ec66eMark Salyzyn/* --------------------------------------------------------------------- */
435c967da341c9395a4c378c149f326505224ec66eMark Salyzyn
44749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/*
455c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * This file uses ", ## __VA_ARGS__" zero-argument token pasting to
465c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * work around issues with debug-only syntax errors in assertions
475c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * that are missing format strings.  See commit
485c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * 19299904343daf191267564fe32e6cd5c165cd42
49ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner */
505c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#if defined(__clang__)
515c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#pragma clang diagnostic push
525c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments"
53749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif
54df7a4c6bae5f85532d79a93b7d9197a2aab17825Mark Salyzyn
555c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#ifndef __predict_false
565c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#define __predict_false(exp) __builtin_expect((exp) != 0, 0)
575c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#endif
58749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
592ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define android_writeLog(prio, tag, text) __android_log_write(prio, tag, text)
60ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner
61749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define android_printLog(prio, tag, ...) \
622ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  __android_log_print(prio, tag, __VA_ARGS__)
63749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
645c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#define android_vprintLog(prio, cond, tag, ...) \
652ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  __android_log_vprint(prio, tag, __VA_ARGS__)
665c967da341c9395a4c378c149f326505224ec66eMark Salyzyn
67749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/*
68749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * Log macro that allows you to specify a number for the priority.
69749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn */
70749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef LOG_PRI
712ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define LOG_PRI(priority, tag, ...) android_printLog(priority, tag, __VA_ARGS__)
72749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif
73749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
74ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner/*
75749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * Log macro that allows you to pass in a varargs ("args" is a va_list).
76749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn */
77749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef LOG_PRI_VA
78749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define LOG_PRI_VA(priority, tag, fmt, args) \
792ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  android_vprintLog(priority, NULL, tag, fmt, args)
80749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif
81ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner
825c967da341c9395a4c378c149f326505224ec66eMark Salyzyn/* --------------------------------------------------------------------- */
83ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner
84749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/* XXX Macros to work around syntax errors in places where format string
85749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * arg is not passed to ALOG_ASSERT, LOG_ALWAYS_FATAL or LOG_ALWAYS_FATAL_IF
86749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * (happens only in debug builds).
87749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn */
886584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
89749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/* Returns 2nd arg.  Used to substitute default value if caller's vararg list
90749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * is empty.
91749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn */
922ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define __android_second(dummy, second, ...) second
93749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
94749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/* If passed multiple args, returns ',' followed by all but 1st arg, otherwise
95749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * returns nothing.
96749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn */
972ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define __android_rest(first, ...) , ##__VA_ARGS__
986584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
992ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define android_printAssert(cond, tag, ...)                     \
1002ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  __android_log_assert(cond, tag,                               \
1012ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn                       __android_second(0, ##__VA_ARGS__, NULL) \
1022ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn                           __android_rest(__VA_ARGS__))
1036584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
1046584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
105749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * Log a fatal error.  If the given condition fails, this stops program
106749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * execution like a normal assertion, but also generating the given message.
107749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * It is NOT stripped from release builds.  Note that the condition test
108749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * is -inverted- from the normal assert() semantics.
1096584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
110749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef LOG_ALWAYS_FATAL_IF
1112ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define LOG_ALWAYS_FATAL_IF(cond, ...)                              \
1122ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ((__predict_false(cond))                                          \
1132ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn       ? ((void)android_printAssert(#cond, LOG_TAG, ##__VA_ARGS__)) \
1142ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn       : (void)0)
1156584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
116749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
117749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef LOG_ALWAYS_FATAL
118749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define LOG_ALWAYS_FATAL(...) \
1192ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  (((void)android_printAssert(NULL, LOG_TAG, ##__VA_ARGS__)))
1206584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
1216584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
1226584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
123749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * Versions of LOG_ALWAYS_FATAL_IF and LOG_ALWAYS_FATAL that
124749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * are stripped out of release builds.
1256584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
126749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
127749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#if LOG_NDEBUG
128749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
129749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef LOG_FATAL_IF
130749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define LOG_FATAL_IF(cond, ...) ((void)0)
131749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif
132749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef LOG_FATAL
133749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define LOG_FATAL(...) ((void)0)
1346584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
1356584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
136749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#else
1376584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
138749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef LOG_FATAL_IF
1392ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define LOG_FATAL_IF(cond, ...) LOG_ALWAYS_FATAL_IF(cond, ##__VA_ARGS__)
140749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif
141749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef LOG_FATAL
142749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define LOG_FATAL(...) LOG_ALWAYS_FATAL(__VA_ARGS__)
1436584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
1446584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
145749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif
146749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
147749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/*
148749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * Assertion that generates a log message when the assertion fails.
149749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * Stripped out of release builds.  Uses the current LOG_TAG.
150749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn */
151749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef ALOG_ASSERT
1522ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ALOG_ASSERT(cond, ...) LOG_FATAL_IF(!(cond), ##__VA_ARGS__)
153749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif
154749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
155749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/* --------------------------------------------------------------------- */
156749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
1576584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
158749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * C/C++ logging functions.  See the logging documentation for API details.
159749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn *
160749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * We'd like these to be available from C code (in case we import some from
161749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * somewhere), so this has a C interface.
162749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn *
163749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * The output will be correct when the log file is shared between multiple
164749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * threads and/or multiple processes so long as the operating system
165749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * supports O_APPEND.  These calls have mutex-protected data structures
166749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * and so are NOT reentrant.  Do not use LOG in a signal handler.
167749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn */
168749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
169749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/* --------------------------------------------------------------------- */
1706584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
1716584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
1726584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Simplified macro to send a verbose log message using the current LOG_TAG.
1736584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
1746584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef ALOGV
1756584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#define __ALOGV(...) ((void)ALOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__))
1766584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#if LOG_NDEBUG
1772ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ALOGV(...)          \
1782ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  do {                      \
1792ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    if (0) {                \
1802ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn      __ALOGV(__VA_ARGS__); \
1812ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    }                       \
1822ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  } while (0)
1836584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#else
1846584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#define ALOGV(...) __ALOGV(__VA_ARGS__)
1856584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
1866584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
1876584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
1886584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef ALOGV_IF
1896584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#if LOG_NDEBUG
1902ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ALOGV_IF(cond, ...) ((void)0)
1916584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#else
1922ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ALOGV_IF(cond, ...)                                                  \
1932ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ((__predict_false(cond)) ? ((void)ALOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__)) \
1942ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn                           : (void)0)
1956584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
1966584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
1976584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
1986584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
1996584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Simplified macro to send a debug log message using the current LOG_TAG.
2006584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
2016584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef ALOGD
2026584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#define ALOGD(...) ((void)ALOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__))
2036584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2046584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2056584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef ALOGD_IF
2062ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ALOGD_IF(cond, ...)                                                \
2072ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ((__predict_false(cond)) ? ((void)ALOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__)) \
2082ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn                           : (void)0)
2096584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2106584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2116584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
2126584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Simplified macro to send an info log message using the current LOG_TAG.
2136584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
2146584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef ALOGI
2156584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#define ALOGI(...) ((void)ALOG(LOG_INFO, LOG_TAG, __VA_ARGS__))
2166584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2176584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2186584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef ALOGI_IF
2192ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ALOGI_IF(cond, ...)                                               \
2202ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ((__predict_false(cond)) ? ((void)ALOG(LOG_INFO, LOG_TAG, __VA_ARGS__)) \
2212ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn                           : (void)0)
2226584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2236584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2246584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
2256584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Simplified macro to send a warning log message using the current LOG_TAG.
2266584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
2276584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef ALOGW
2286584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#define ALOGW(...) ((void)ALOG(LOG_WARN, LOG_TAG, __VA_ARGS__))
2296584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2306584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2316584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef ALOGW_IF
2322ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ALOGW_IF(cond, ...)                                               \
2332ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ((__predict_false(cond)) ? ((void)ALOG(LOG_WARN, LOG_TAG, __VA_ARGS__)) \
2342ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn                           : (void)0)
2356584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2366584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2376584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
2386584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Simplified macro to send an error log message using the current LOG_TAG.
2396584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
2406584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef ALOGE
2416584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#define ALOGE(...) ((void)ALOG(LOG_ERROR, LOG_TAG, __VA_ARGS__))
2426584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2436584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2446584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef ALOGE_IF
2452ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ALOGE_IF(cond, ...)                                                \
2462ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ((__predict_false(cond)) ? ((void)ALOG(LOG_ERROR, LOG_TAG, __VA_ARGS__)) \
2472ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn                           : (void)0)
2486584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2496584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
250749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/* --------------------------------------------------------------------- */
2516584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2526584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
2536584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Conditional based on whether the current LOG_TAG is enabled at
2546584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * verbose priority.
2556584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
2566584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef IF_ALOGV
2576584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#if LOG_NDEBUG
2586584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#define IF_ALOGV() if (false)
2596584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#else
2606584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#define IF_ALOGV() IF_ALOG(LOG_VERBOSE, LOG_TAG)
2616584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2626584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2636584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2646584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
2656584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Conditional based on whether the current LOG_TAG is enabled at
2666584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * debug priority.
2676584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
2686584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef IF_ALOGD
2696584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#define IF_ALOGD() IF_ALOG(LOG_DEBUG, LOG_TAG)
2706584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2716584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2726584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
2736584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Conditional based on whether the current LOG_TAG is enabled at
2746584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * info priority.
2756584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
2766584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef IF_ALOGI
2776584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#define IF_ALOGI() IF_ALOG(LOG_INFO, LOG_TAG)
2786584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2796584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2806584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
2816584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Conditional based on whether the current LOG_TAG is enabled at
2826584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * warn priority.
2836584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
2846584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef IF_ALOGW
2856584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#define IF_ALOGW() IF_ALOG(LOG_WARN, LOG_TAG)
2866584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2876584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2886584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
2896584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Conditional based on whether the current LOG_TAG is enabled at
2906584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * error priority.
2916584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
2926584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef IF_ALOGE
2936584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#define IF_ALOGE() IF_ALOG(LOG_ERROR, LOG_TAG)
2946584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
2956584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
296749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/* --------------------------------------------------------------------- */
2976584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
2986584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
2996584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Basic log message macro.
3006584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn *
3016584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Example:
3026584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn *  ALOG(LOG_WARN, NULL, "Failed with error %d", errno);
3036584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn *
3046584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * The second argument may be NULL or "" to indicate the "global" tag.
3056584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
3066584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef ALOG
3072ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define ALOG(priority, tag, ...) LOG_PRI(ANDROID_##priority, tag, __VA_ARGS__)
3086584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
3096584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
3106584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
3116584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn * Conditional given a desired logging priority and tag.
3126584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
3136584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#ifndef IF_ALOG
3142ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define IF_ALOG(priority, tag) if (android_testLog(ANDROID_##priority, tag))
3156584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
3166584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
317749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/* --------------------------------------------------------------------- */
3186584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
3196584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
320749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn *    IF_ALOG uses android_testLog, but IF_ALOG can be overridden.
321749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn *    android_testLog will remain constant in its purpose as a wrapper
322749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn *        for Android logging filter policy, and can be subject to
323749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn *        change. It can be reused by the developers that override
324749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn *        IF_ALOG as a convenient means to reimplement their policy
325749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn *        over Android.
3266584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
3276584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
328749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef __ANDROID_USE_LIBLOG_LOGGABLE_INTERFACE
329749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef __ANDROID_API__
330749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define __ANDROID_USE_LIBLOG_LOGGABLE_INTERFACE 2
331749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#elif __ANDROID_API__ > 24 /* > Nougat */
332749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define __ANDROID_USE_LIBLOG_LOGGABLE_INTERFACE 2
333749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#elif __ANDROID_API__ > 22 /* > Lollipop */
334749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define __ANDROID_USE_LIBLOG_LOGGABLE_INTERFACE 1
335749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#else
336749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define __ANDROID_USE_LIBLOG_LOGGABLE_INTERFACE 0
337749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif
338749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif
3396584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
340749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#if __ANDROID_USE_LIBLOG_LOGGABLE_INTERFACE
3416584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
3426584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn/*
343749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * Use the per-tag properties "log.tag.<tagname>" to generate a runtime
344749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * result of non-zero to expose a log. prio is ANDROID_LOG_VERBOSE to
345749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * ANDROID_LOG_FATAL. default_prio if no property. Undefined behavior if
346749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * any other value.
3476584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn */
348749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzynint __android_log_is_loggable(int prio, const char* tag, int default_prio);
3496584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
350749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#if __ANDROID_USE_LIBLOG_LOGGABLE_INTERFACE > 1
351749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#include <sys/types.h>
3526584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
353749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzynint __android_log_is_loggable_len(int prio, const char* tag, size_t len,
354749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn                                  int default_prio);
3556584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
3566584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#if LOG_NDEBUG /* Production */
3572ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define android_testLog(prio, tag)                                           \
3582ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  (__android_log_is_loggable_len(prio, tag, (tag && *tag) ? strlen(tag) : 0, \
3592ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn                                 ANDROID_LOG_DEBUG) != 0)
3606584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#else
3612ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define android_testLog(prio, tag)                                           \
3622ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  (__android_log_is_loggable_len(prio, tag, (tag && *tag) ? strlen(tag) : 0, \
3632ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn                                 ANDROID_LOG_VERBOSE) != 0)
3646584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
3656584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
366749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#else
3676584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
368749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#if LOG_NDEBUG /* Production */
369749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define android_testLog(prio, tag) \
3702ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  (__android_log_is_loggable(prio, tag, ANDROID_LOG_DEBUG) != 0)
371749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#else
372749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define android_testLog(prio, tag) \
3732ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  (__android_log_is_loggable(prio, tag, ANDROID_LOG_VERBOSE) != 0)
374749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif
3756584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
3766584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
377749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
378749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#else /* __ANDROID_USE_LIBLOG_LOGGABLE_INTERFACE */
379749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
380749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define android_testLog(prio, tag) (1)
381749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn
382749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif /* !__ANDROID_USE_LIBLOG_LOGGABLE_INTERFACE */
3836584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
3846584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#if defined(__clang__)
3856584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#pragma clang diagnostic pop
3866584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn#endif
3876584d0a35ab7722bdc6590525dee29f72f0ec576Mark Salyzyn
388ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner#ifdef __cplusplus
389ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner}
390ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner#endif
391ebefc48e61a7d5cf2a3228e6c8729feeeb42d1b4David 'Digit' Turner
3925c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#endif /* _LIBS_LOG_LOG_MAIN_H */
393