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