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