1749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/* 2749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * Copyright (C) 2005-2014 The Android Open Source Project 3749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * 4749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * Licensed under the Apache License, Version 2.0 (the "License"); 5749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * you may not use this file except in compliance with the License. 6749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * You may obtain a copy of the License at 7749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * 8749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * http://www.apache.org/licenses/LICENSE-2.0 9749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * 10749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * Unless required by applicable law or agreed to in writing, software 11749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * distributed under the License is distributed on an "AS IS" BASIS, 12749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * See the License for the specific language governing permissions and 14749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * limitations under the License. 15749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn */ 16749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn 17749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef _LIBS_LOG_LOG_H 18749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define _LIBS_LOG_LOG_H 19749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn 20749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/* Too many in the ecosystem assume these are included */ 21749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#if !defined(_WIN32) 22749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#include <pthread.h> 23749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif 242ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#include <stdint.h> /* uint16_t, int32_t */ 25749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#include <stdio.h> 26749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#include <sys/types.h> 27fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn#include <time.h> 28749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#include <unistd.h> 29749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn 30a166708d1541007ab5502040051e31863a29edceMark Salyzyn#include <android/log.h> 313cdbdd522fbbb2611713805c72c6d741a91bcfd5Mark Salyzyn#include <log/log_id.h> 325c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#include <log/log_main.h> 33c89fea44accab8c95cf9b7d74c265439963fbd8aMark Salyzyn#include <log/log_radio.h> 3421de8aca67fd8b2f1e10ef250509164c34fc7049Mark Salyzyn#include <log/log_read.h> 35dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn#include <log/log_system.h> 3652c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn#include <log/log_time.h> 37472245d9625b8f0c52737aa8753524facfa211dbMark Salyzyn#include <log/uio.h> /* helper to define iovec for portability */ 38749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn 39749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifdef __cplusplus 40749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzynextern "C" { 41749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif 42749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn 43749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/* 44749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * LOG_TAG is the local tag used for the following simplified 45749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * logging macros. You can change this preprocessor definition 46749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * before using the other macros to change the tag. 47749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn */ 48749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn 49749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef LOG_TAG 50749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define LOG_TAG NULL 51749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif 52749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn 535c967da341c9395a4c378c149f326505224ec66eMark Salyzyn/* 545c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * Normally we strip the effects of ALOGV (VERBOSE messages), 555c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * LOG_FATAL and LOG_FATAL_IF (FATAL assert messages) from the 565c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * release builds be defining NDEBUG. You can modify this (for 575c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * example with "#define LOG_NDEBUG 0" at the top of your source 585c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * file) to change that behavior. 595c967da341c9395a4c378c149f326505224ec66eMark Salyzyn */ 605c967da341c9395a4c378c149f326505224ec66eMark Salyzyn 615c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#ifndef LOG_NDEBUG 625c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#ifdef NDEBUG 635c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#define LOG_NDEBUG 1 645c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#else 655c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#define LOG_NDEBUG 0 665c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#endif 675c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#endif 685c967da341c9395a4c378c149f326505224ec66eMark Salyzyn 69749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/* --------------------------------------------------------------------- */ 70749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn 71749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/* 72749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * This file uses ", ## __VA_ARGS__" zero-argument token pasting to 73749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * work around issues with debug-only syntax errors in assertions 74749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * that are missing format strings. See commit 75749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * 19299904343daf191267564fe32e6cd5c165cd42 76749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn */ 77749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#if defined(__clang__) 78749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#pragma clang diagnostic push 79749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments" 80749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif 81749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn 82749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/* --------------------------------------------------------------------- */ 83749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn 84749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/* 85749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * Event logging. 86749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn */ 87749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn 88749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/* 89749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * The following should not be used directly. 90749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn */ 91749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn 92749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzynint __android_log_bwrite(int32_t tag, const void* payload, size_t len); 93749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzynint __android_log_btwrite(int32_t tag, char type, const void* payload, 94749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn size_t len); 95749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzynint __android_log_bswrite(int32_t tag, const char* payload); 96749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn 97749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define android_bWriteLog(tag, payload, len) \ 982ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn __android_log_bwrite(tag, payload, len) 99749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define android_btWriteLog(tag, type, payload, len) \ 1002ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn __android_log_btwrite(tag, type, payload, len) 101749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn 102749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/* 103749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * Event log entry types. 104749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn */ 105749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef __AndroidEventLogType_defined 106749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define __AndroidEventLogType_defined 107749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyntypedef enum { 1082ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn /* Special markers for android_log_list_element type */ 1092ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn EVENT_TYPE_LIST_STOP = '\n', /* declare end of list */ 1102ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn EVENT_TYPE_UNKNOWN = '?', /* protocol error */ 1112ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn 1122ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn /* must match with declaration in java/android/android/util/EventLog.java */ 1132ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn EVENT_TYPE_INT = 0, /* int32_t */ 1142ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn EVENT_TYPE_LONG = 1, /* int64_t */ 1152ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn EVENT_TYPE_STRING = 2, 1162ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn EVENT_TYPE_LIST = 3, 1172ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn EVENT_TYPE_FLOAT = 4, 118749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn} AndroidEventLogType; 119749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif 120749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define sizeof_AndroidEventLogType sizeof(typeof_AndroidEventLogType) 121749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define typeof_AndroidEventLogType unsigned char 122749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn 123749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef LOG_EVENT_INT 1242ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define LOG_EVENT_INT(_tag, _value) \ 1252ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn { \ 1262ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn int intBuf = _value; \ 1272ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn (void)android_btWriteLog(_tag, EVENT_TYPE_INT, &intBuf, sizeof(intBuf)); \ 1282ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 129749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif 130749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef LOG_EVENT_LONG 1312ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define LOG_EVENT_LONG(_tag, _value) \ 1322ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn { \ 1332ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn long long longBuf = _value; \ 1342ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn (void)android_btWriteLog(_tag, EVENT_TYPE_LONG, &longBuf, sizeof(longBuf)); \ 1352ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 136749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif 137749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef LOG_EVENT_FLOAT 1382ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define LOG_EVENT_FLOAT(_tag, _value) \ 1392ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn { \ 1402ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn float floatBuf = _value; \ 1412ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn (void)android_btWriteLog(_tag, EVENT_TYPE_FLOAT, &floatBuf, \ 1422ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn sizeof(floatBuf)); \ 1432ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 144749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif 145749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef LOG_EVENT_STRING 1462ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define LOG_EVENT_STRING(_tag, _value) \ 1472ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn (void)__android_log_bswrite(_tag, _value); 148749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif 149749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn 150aeaaf81c2cc8366ac4f66eb3d2fc85f9b8194982Mark Salyzyn#ifdef __linux__ 151aeaaf81c2cc8366ac4f66eb3d2fc85f9b8194982Mark Salyzyn 152aeaaf81c2cc8366ac4f66eb3d2fc85f9b8194982Mark Salyzyn#ifndef __ANDROID_USE_LIBLOG_CLOCK_INTERFACE 153aeaaf81c2cc8366ac4f66eb3d2fc85f9b8194982Mark Salyzyn#ifndef __ANDROID_API__ 154aeaaf81c2cc8366ac4f66eb3d2fc85f9b8194982Mark Salyzyn#define __ANDROID_USE_LIBLOG_CLOCK_INTERFACE 1 155aeaaf81c2cc8366ac4f66eb3d2fc85f9b8194982Mark Salyzyn#elif __ANDROID_API__ > 22 /* > Lollipop */ 156aeaaf81c2cc8366ac4f66eb3d2fc85f9b8194982Mark Salyzyn#define __ANDROID_USE_LIBLOG_CLOCK_INTERFACE 1 157aeaaf81c2cc8366ac4f66eb3d2fc85f9b8194982Mark Salyzyn#else 158aeaaf81c2cc8366ac4f66eb3d2fc85f9b8194982Mark Salyzyn#define __ANDROID_USE_LIBLOG_CLOCK_INTERFACE 0 159aeaaf81c2cc8366ac4f66eb3d2fc85f9b8194982Mark Salyzyn#endif 160aeaaf81c2cc8366ac4f66eb3d2fc85f9b8194982Mark Salyzyn#endif 161aeaaf81c2cc8366ac4f66eb3d2fc85f9b8194982Mark Salyzyn 162aeaaf81c2cc8366ac4f66eb3d2fc85f9b8194982Mark Salyzyn#if __ANDROID_USE_LIBLOG_CLOCK_INTERFACE 163aeaaf81c2cc8366ac4f66eb3d2fc85f9b8194982Mark Salyzynclockid_t android_log_clockid(); 164aeaaf81c2cc8366ac4f66eb3d2fc85f9b8194982Mark Salyzyn#endif 165aeaaf81c2cc8366ac4f66eb3d2fc85f9b8194982Mark Salyzyn 166aeaaf81c2cc8366ac4f66eb3d2fc85f9b8194982Mark Salyzyn#endif /* __linux__ */ 167aeaaf81c2cc8366ac4f66eb3d2fc85f9b8194982Mark Salyzyn 168aeaaf81c2cc8366ac4f66eb3d2fc85f9b8194982Mark Salyzyn/* --------------------------------------------------------------------- */ 169aeaaf81c2cc8366ac4f66eb3d2fc85f9b8194982Mark Salyzyn 170749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef _ANDROID_USE_LIBLOG_SAFETYNET_INTERFACE 171749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef __ANDROID_API__ 172749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define __ANDROID_USE_LIBLOG_SAFETYNET_INTERFACE 1 173749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#elif __ANDROID_API__ > 22 /* > Lollipop */ 174749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define __ANDROID_USE_LIBLOG_SAFETYNET_INTERFACE 1 175749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#else 176749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define __ANDROID_USE_LIBLOG_SAFETYNET_INTERFACE 0 177749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif 178749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif 179749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn 180749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#if __ANDROID_USE_LIBLOG_SAFETYNET_INTERFACE 181749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn 182749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define android_errorWriteLog(tag, subTag) \ 1832ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn __android_log_error_write(tag, subTag, -1, NULL, 0) 184749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn 185749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define android_errorWriteWithInfoLog(tag, subTag, uid, data, dataLen) \ 1862ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn __android_log_error_write(tag, subTag, uid, data, dataLen) 187749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn 188749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzynint __android_log_error_write(int tag, const char* subTag, int32_t uid, 189749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn const char* data, uint32_t dataLen); 190749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn 191749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif /* __ANDROID_USE_LIBLOG_SAFETYNET_INTERFACE */ 192749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn 193749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/* --------------------------------------------------------------------- */ 194749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn 195749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef __ANDROID_USE_LIBLOG_CLOSE_INTERFACE 196749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifndef __ANDROID_API__ 197749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define __ANDROID_USE_LIBLOG_CLOSE_INTERFACE 1 198749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#elif __ANDROID_API__ > 18 /* > JellyBean */ 199749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define __ANDROID_USE_LIBLOG_CLOSE_INTERFACE 1 200749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#else 201749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#define __ANDROID_USE_LIBLOG_CLOSE_INTERFACE 0 202749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif 203749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif 204749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn 205749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#if __ANDROID_USE_LIBLOG_CLOSE_INTERFACE 206749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn/* 207749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * Release any logger resources (a new log write will immediately re-acquire) 208749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * 209749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * May be used to clean up File descriptors after a Fork, the resources are 210749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn * all O_CLOEXEC so wil self clean on exec(). 211749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn */ 212749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzynvoid __android_log_close(); 213749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif 214749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn 215fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn#ifndef __ANDROID_USE_LIBLOG_RATELIMIT_INTERFACE 216fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn#ifndef __ANDROID_API__ 217fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn#define __ANDROID_USE_LIBLOG_RATELIMIT_INTERFACE 1 218fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn#elif __ANDROID_API__ > 25 /* > OC */ 219fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn#define __ANDROID_USE_LIBLOG_RATELIMIT_INTERFACE 1 220fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn#else 221fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn#define __ANDROID_USE_LIBLOG_RATELIMIT_INTERFACE 0 222fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn#endif 223fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn#endif 224fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn 225fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn#if __ANDROID_USE_LIBLOG_RATELIMIT_INTERFACE 226fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn 227fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn/* 228fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn * if last is NULL, caller _must_ provide a consistent value for seconds. 229fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn * 230fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn * Return -1 if we can not acquire a lock, which below will permit the logging, 231fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn * error on allowing a log message through. 232fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn */ 233fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzynint __android_log_ratelimit(time_t seconds, time_t* last); 234fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn 235fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn/* 236fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn * Usage: 237fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn * 238fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn * // Global default and state 239fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn * IF_ALOG_RATELIMIT() { 240fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn * ALOG*(...); 241fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn * } 242fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn * 243fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn * // local state, 10 seconds ratelimit 244fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn * static time_t local_state; 245fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn * IF_ALOG_RATELIMIT_LOCAL(10, &local_state) { 246fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn * ALOG*(...); 247fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn * } 248fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn */ 249fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn 2502ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn#define IF_ALOG_RATELIMIT() if (__android_log_ratelimit(0, NULL) > 0) 251fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn#define IF_ALOG_RATELIMIT_LOCAL(seconds, state) \ 2522ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn if (__android_log_ratelimit(seconds, state) > 0) 253fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn 254fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn#else 255fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn 256fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn/* No ratelimiting as API unsupported */ 257fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn#define IF_ALOG_RATELIMIT() if (1) 258fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn#define IF_ALOG_RATELIMIT_LOCAL(...) if (1) 259fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn 260fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn#endif 261fc148f7f3371ccc0584261dd0b2462c09798d4f8Mark Salyzyn 262749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#if defined(__clang__) 263749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#pragma clang diagnostic pop 264749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif 265749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn 266749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#ifdef __cplusplus 267749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn} 268749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif 269749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn 270749a298dfd6791644cc2815989248984bf7ab2c2Mark Salyzyn#endif /* _LIBS_LOG_LOG_H */ 271