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