diff --git a/include/android b/include/android new file mode 120000 index 000000000..487239387 --- /dev/null +++ b/include/android @@ -0,0 +1 @@ +../liblog/include/android \ No newline at end of file diff --git a/liblog/include/android/log.h b/liblog/include/android/log.h new file mode 100644 index 000000000..9f198fe87 --- /dev/null +++ b/liblog/include/android/log.h @@ -0,0 +1,156 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _ANDROID_LOG_H +#define _ANDROID_LOG_H + +/****************************************************************** + * + * IMPORTANT NOTICE: + * + * This file is part of Android's set of stable system headers + * exposed by the Android NDK (Native Development Kit) since + * platform release 1.5 + * + * Third-party source AND binary code relies on the definitions + * here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES. + * + * - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES) + * - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS + * - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY + * - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES + */ + +/* + * Support routines to send messages to the Android in-kernel log buffer, + * which can later be accessed through the 'logcat' utility. + * + * Each log message must have + * - a priority + * - a log tag + * - some text + * + * The tag normally corresponds to the component that emits the log message, + * and should be reasonably small. + * + * Log message text may be truncated to less than an implementation-specific + * limit (e.g. 1023 characters max). + * + * Note that a newline character ("\n") will be appended automatically to your + * log message, if not already there. It is not possible to send several messages + * and have them appear on a single line in logcat. + * + * PLEASE USE LOGS WITH MODERATION: + * + * - Sending log messages eats CPU and slow down your application and the + * system. + * + * - The circular log buffer is pretty small (<64KB), sending many messages + * might push off other important log messages from the rest of the system. + * + * - In release builds, only send log messages to account for exceptional + * conditions. + * + * NOTE: These functions MUST be implemented by /system/lib/liblog.so + */ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Android log priority values, in ascending priority order. + */ +typedef enum android_LogPriority { + ANDROID_LOG_UNKNOWN = 0, + ANDROID_LOG_DEFAULT, /* only for SetMinPriority() */ + ANDROID_LOG_VERBOSE, + ANDROID_LOG_DEBUG, + ANDROID_LOG_INFO, + ANDROID_LOG_WARN, + ANDROID_LOG_ERROR, + ANDROID_LOG_FATAL, + ANDROID_LOG_SILENT, /* only for SetMinPriority(); must be last */ +} android_LogPriority; + +/* + * Send a simple string to the log. + */ +int __android_log_write(int prio, const char* tag, const char* text); + +/* + * Send a formatted string to the log, used like printf(fmt,...) + */ +int __android_log_print(int prio, const char* tag, const char* fmt, ...) +#if defined(__GNUC__) +#ifdef __USE_MINGW_ANSI_STDIO +#if __USE_MINGW_ANSI_STDIO + __attribute__ ((__format__(gnu_printf, 3, 4))) +#else + __attribute__ ((__format__(printf, 3, 4))) +#endif +#else + __attribute__ ((__format__(printf, 3, 4))) +#endif +#endif + ; + +/* + * A variant of __android_log_print() that takes a va_list to list + * additional parameters. + */ +int __android_log_vprint(int prio, const char* tag, + const char* fmt, va_list ap) +#if defined(__GNUC__) +#ifdef __USE_MINGW_ANSI_STDIO +#if __USE_MINGW_ANSI_STDIO + __attribute__ ((__format__(gnu_printf, 3, 0))) +#else + __attribute__ ((__format__(printf, 3, 0))) +#endif +#else + __attribute__ ((__format__(printf, 3, 0))) +#endif +#endif + ; + +/* + * Log an assertion failure and abort the process to have a chance + * to inspect it if a debugger is attached. This uses the FATAL priority. + */ +void __android_log_assert(const char* cond, const char* tag, + const char* fmt, ...) +#if defined(__GNUC__) + __attribute__ ((__noreturn__)) +#ifdef __USE_MINGW_ANSI_STDIO +#if __USE_MINGW_ANSI_STDIO + __attribute__ ((__format__(gnu_printf, 3, 4))) +#else + __attribute__ ((__format__(printf, 3, 4))) +#endif +#else + __attribute__ ((__format__(printf, 3, 4))) +#endif +#endif + ; + +#ifdef __cplusplus +} +#endif + +#endif /* _ANDROID_LOG_H */ diff --git a/liblog/include/log/log.h b/liblog/include/log/log.h index ece9ea6d1..6a7450cc5 100644 --- a/liblog/include/log/log.h +++ b/liblog/include/log/log.h @@ -28,6 +28,9 @@ #include #include +#include +#include +#include #include /* helper to define iovec for portability */ #ifdef __cplusplus @@ -44,6 +47,22 @@ extern "C" { #define LOG_TAG NULL #endif +/* + * Normally we strip the effects of ALOGV (VERBOSE messages), + * LOG_FATAL and LOG_FATAL_IF (FATAL assert messages) from the + * release builds be defining NDEBUG. You can modify this (for + * example with "#define LOG_NDEBUG 0" at the top of your source + * file) to change that behavior. + */ + +#ifndef LOG_NDEBUG +#ifdef NDEBUG +#define LOG_NDEBUG 1 +#else +#define LOG_NDEBUG 0 +#endif +#endif + /* --------------------------------------------------------------------- */ /* @@ -57,16 +76,6 @@ extern "C" { #pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments" #endif -/* - * Send a simple string to the log. - */ -int __android_log_buf_write(int bufID, int prio, const char* tag, const char* text); -int __android_log_buf_print(int bufID, int prio, const char* tag, const char* fmt, ...) -#if defined(__GNUC__) - __attribute__((__format__(printf, 4, 5))) -#endif - ; - /* * Simplified macro to send a verbose system log message using current LOG_TAG. */ @@ -153,92 +162,6 @@ int __android_log_buf_print(int bufID, int prio, const char* tag, const char* fm /* --------------------------------------------------------------------- */ -/* - * Simplified macro to send a verbose radio log message using current LOG_TAG. - */ -#ifndef RLOGV -#define __RLOGV(...) \ - ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__)) -#if LOG_NDEBUG -#define RLOGV(...) do { if (0) { __RLOGV(__VA_ARGS__); } } while (0) -#else -#define RLOGV(...) __RLOGV(__VA_ARGS__) -#endif -#endif - -#ifndef RLOGV_IF -#if LOG_NDEBUG -#define RLOGV_IF(cond, ...) ((void)0) -#else -#define RLOGV_IF(cond, ...) \ - ( (__predict_false(cond)) \ - ? ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__)) \ - : (void)0 ) -#endif -#endif - -/* - * Simplified macro to send a debug radio log message using current LOG_TAG. - */ -#ifndef RLOGD -#define RLOGD(...) \ - ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)) -#endif - -#ifndef RLOGD_IF -#define RLOGD_IF(cond, ...) \ - ( (__predict_false(cond)) \ - ? ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)) \ - : (void)0 ) -#endif - -/* - * Simplified macro to send an info radio log message using current LOG_TAG. - */ -#ifndef RLOGI -#define RLOGI(...) \ - ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)) -#endif - -#ifndef RLOGI_IF -#define RLOGI_IF(cond, ...) \ - ( (__predict_false(cond)) \ - ? ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)) \ - : (void)0 ) -#endif - -/* - * Simplified macro to send a warning radio log message using current LOG_TAG. - */ -#ifndef RLOGW -#define RLOGW(...) \ - ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)) -#endif - -#ifndef RLOGW_IF -#define RLOGW_IF(cond, ...) \ - ( (__predict_false(cond)) \ - ? ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)) \ - : (void)0 ) -#endif - -/* - * Simplified macro to send an error radio log message using current LOG_TAG. - */ -#ifndef RLOGE -#define RLOGE(...) \ - ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)) -#endif - -#ifndef RLOGE_IF -#define RLOGE_IF(cond, ...) \ - ( (__predict_false(cond)) \ - ? ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)) \ - : (void)0 ) -#endif - -/* --------------------------------------------------------------------- */ - /* * Event logging. */ @@ -304,25 +227,6 @@ typedef enum { (void) __android_log_bswrite(_tag, _value); #endif -#ifndef log_id_t_defined -#define log_id_t_defined -typedef enum log_id { - LOG_ID_MIN = 0, - - LOG_ID_MAIN = 0, - LOG_ID_RADIO = 1, - LOG_ID_EVENTS = 2, - LOG_ID_SYSTEM = 3, - LOG_ID_CRASH = 4, - LOG_ID_SECURITY = 5, - LOG_ID_KERNEL = 6, /* place last, third-parties can not use it */ - - LOG_ID_MAX -} log_id_t; -#endif -#define sizeof_log_id_t sizeof(typeof_log_id_t) -#define typeof_log_id_t unsigned char - /* --------------------------------------------------------------------- */ /* @@ -759,12 +663,6 @@ clockid_t android_log_clockid(); #endif /* __linux__ */ -/* - * log_id_t helpers - */ -log_id_t android_name_to_log_id(const char* logName); -const char* android_log_id_to_name(log_id_t log_id); - /* --------------------------------------------------------------------- */ #ifndef _ANDROID_USE_LIBLOG_SAFETYNET_INTERFACE diff --git a/liblog/include/log/log_id.h b/liblog/include/log/log_id.h new file mode 100644 index 000000000..3078e4eb1 --- /dev/null +++ b/liblog/include/log/log_id.h @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2005-2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _LIBS_LOG_LOG_ID_H +#define _LIBS_LOG_LOG_ID_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef log_id_t_defined +#define log_id_t_defined +typedef enum log_id { + LOG_ID_MIN = 0, + + LOG_ID_MAIN = 0, + LOG_ID_RADIO = 1, + LOG_ID_EVENTS = 2, + LOG_ID_SYSTEM = 3, + LOG_ID_CRASH = 4, + LOG_ID_SECURITY = 5, + LOG_ID_KERNEL = 6, /* place last, third-parties can not use it */ + + LOG_ID_MAX +} log_id_t; +#endif +#define sizeof_log_id_t sizeof(typeof_log_id_t) +#define typeof_log_id_t unsigned char + +/* + * Send a simple string to the log. + */ +int __android_log_buf_write(int bufID, int prio, const char* tag, const char* text); +int __android_log_buf_print(int bufID, int prio, const char* tag, const char* fmt, ...) +#if defined(__GNUC__) + __attribute__((__format__(printf, 4, 5))) +#endif + ; + +/* + * log_id_t helpers + */ +log_id_t android_name_to_log_id(const char* logName); +const char* android_log_id_to_name(log_id_t log_id); + +#ifdef __cplusplus +} +#endif + +#endif /* _LIBS_LOG_LOG_ID_H */ diff --git a/include/android/log.h b/liblog/include/log/log_main.h similarity index 71% rename from include/android/log.h rename to liblog/include/log/log_main.h index 567335786..f45397ab8 100644 --- a/include/android/log.h +++ b/liblog/include/log/log_main.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009 The Android Open Source Project + * Copyright (C) 2005-2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,87 +14,15 @@ * limitations under the License. */ -#ifndef _ANDROID_LOG_H -#define _ANDROID_LOG_H +#ifndef _LIBS_LOG_LOG_MAIN_H +#define _LIBS_LOG_LOG_MAIN_H -/****************************************************************** - * - * IMPORTANT NOTICE: - * - * This file is part of Android's set of stable system headers - * exposed by the Android NDK (Native Development Kit) since - * platform release 1.5 - * - * Third-party source AND binary code relies on the definitions - * here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES. - * - * - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES) - * - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS - * - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY - * - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES - */ - -/* - * Support routines to send messages to the Android in-kernel log buffer, - * which can later be accessed through the 'logcat' utility. - * - * Each log message must have - * - a priority - * - a log tag - * - some text - * - * The tag normally corresponds to the component that emits the log message, - * and should be reasonably small. - * - * Log message text may be truncated to less than an implementation-specific - * limit (e.g. 1023 characters max). - * - * Note that a newline character ("\n") will be appended automatically to your - * log message, if not already there. It is not possible to send several messages - * and have them appear on a single line in logcat. - * - * PLEASE USE LOGS WITH MODERATION: - * - * - Sending log messages eats CPU and slow down your application and the - * system. - * - * - The circular log buffer is pretty small (<64KB), sending many messages - * might push off other important log messages from the rest of the system. - * - * - In release builds, only send log messages to account for exceptional - * conditions. - * - * NOTE: These functions MUST be implemented by /system/lib/liblog.so - */ - -#include +#include #ifdef __cplusplus extern "C" { #endif -/* - * This file uses ", ## __VA_ARGS__" zero-argument token pasting to - * work around issues with debug-only syntax errors in assertions - * that are missing format strings. See commit - * 19299904343daf191267564fe32e6cd5c165cd42 - */ -#if defined(__clang__) -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments" -#endif - -#ifndef __predict_false -#define __predict_false(exp) __builtin_expect((exp) != 0, 0) -#endif - -/* - * LOG_TAG is the local tag used for the following simplified - * logging macros. You must set this preprocessor definition, - * or more tenuously supply a variable definition, before using - * the macros. - */ - /* * Normally we strip the effects of ALOGV (VERBOSE messages), * LOG_FATAL and LOG_FATAL_IF (FATAL assert messages) from the @@ -111,52 +39,32 @@ extern "C" { #endif #endif -/* - * Android log priority values, in ascending priority order. - */ -#ifndef __android_LogPriority_defined -#define __android_LogPriority_defined -typedef enum android_LogPriority { - ANDROID_LOG_UNKNOWN = 0, - ANDROID_LOG_DEFAULT, /* only for SetMinPriority() */ - ANDROID_LOG_VERBOSE, - ANDROID_LOG_DEBUG, - ANDROID_LOG_INFO, - ANDROID_LOG_WARN, - ANDROID_LOG_ERROR, - ANDROID_LOG_FATAL, - ANDROID_LOG_SILENT, /* only for SetMinPriority(); must be last */ -} android_LogPriority; -#endif +/* --------------------------------------------------------------------- */ /* - * Send a simple string to the log. + * This file uses ", ## __VA_ARGS__" zero-argument token pasting to + * work around issues with debug-only syntax errors in assertions + * that are missing format strings. See commit + * 19299904343daf191267564fe32e6cd5c165cd42 */ -int __android_log_write(int prio, const char* tag, const char* text); +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments" +#endif + +#ifndef __predict_false +#define __predict_false(exp) __builtin_expect((exp) != 0, 0) +#endif #define android_writeLog(prio, tag, text) \ __android_log_write(prio, tag, text) -/* - * Send a formatted string to the log, used like printf(fmt,...) - */ -int __android_log_print(int prio, const char* tag, const char* fmt, ...) -#if defined(__GNUC__) -#ifdef __USE_MINGW_ANSI_STDIO -#if __USE_MINGW_ANSI_STDIO - __attribute__ ((format(gnu_printf, 3, 4))) -#else - __attribute__ ((format(printf, 3, 4))) -#endif -#else - __attribute__ ((format(printf, 3, 4))) -#endif -#endif - ; - #define android_printLog(prio, tag, ...) \ __android_log_print(prio, tag, __VA_ARGS__) +#define android_vprintLog(prio, cond, tag, ...) \ + __android_log_vprint(prio, tag, __VA_ARGS__) + /* * Log macro that allows you to specify a number for the priority. */ @@ -165,28 +73,6 @@ int __android_log_print(int prio, const char* tag, const char* fmt, ...) android_printLog(priority, tag, __VA_ARGS__) #endif -/* - * A variant of __android_log_print() that takes a va_list to list - * additional parameters. - */ -int __android_log_vprint(int prio, const char* tag, - const char* fmt, va_list ap) -#if defined(__GNUC__) -#ifdef __USE_MINGW_ANSI_STDIO -#if __USE_MINGW_ANSI_STDIO - __attribute__ ((format(gnu_printf, 3, 0))) -#else - __attribute__ ((format(printf, 3, 0))) -#endif -#else - __attribute__ ((format(printf, 3, 0))) -#endif -#endif - ; - -#define android_vprintLog(prio, cond, tag, ...) \ - __android_log_vprint(prio, tag, __VA_ARGS__) - /* * Log macro that allows you to pass in a varargs ("args" is a va_list). */ @@ -195,25 +81,7 @@ int __android_log_vprint(int prio, const char* tag, android_vprintLog(priority, NULL, tag, fmt, args) #endif -/* - * Log an assertion failure and abort the process to have a chance - * to inspect it if a debugger is attached. This uses the FATAL priority. - */ -void __android_log_assert(const char* cond, const char* tag, - const char* fmt, ...) -#if defined(__GNUC__) - __attribute__ ((__noreturn__)) -#ifdef __USE_MINGW_ANSI_STDIO -#if __USE_MINGW_ANSI_STDIO - __attribute__ ((format(gnu_printf, 3, 4))) -#else - __attribute__ ((format(printf, 3, 4))) -#endif -#else - __attribute__ ((format(printf, 3, 4))) -#endif -#endif - ; +/* --------------------------------------------------------------------- */ /* XXX Macros to work around syntax errors in places where format string * arg is not passed to ALOG_ASSERT, LOG_ALWAYS_FATAL or LOG_ALWAYS_FATAL_IF @@ -524,4 +392,4 @@ int __android_log_is_loggable_len(int prio, const char* tag, size_t len, } #endif -#endif /* _ANDROID_LOG_H */ +#endif /* _LIBS_LOG_LOG_MAIN_H */ diff --git a/liblog/include/log/log_radio.h b/liblog/include/log/log_radio.h new file mode 100644 index 000000000..30a73f267 --- /dev/null +++ b/liblog/include/log/log_radio.h @@ -0,0 +1,125 @@ +/* + * Copyright (C) 2005-2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _LIBS_LOG_LOG_RADIO_H +#define _LIBS_LOG_LOG_RADIO_H + +#include +#include + +/* + * Normally we strip the effects of ALOGV (VERBOSE messages), + * LOG_FATAL and LOG_FATAL_IF (FATAL assert messages) from the + * release builds be defining NDEBUG. You can modify this (for + * example with "#define LOG_NDEBUG 0" at the top of your source + * file) to change that behavior. + */ + +#ifndef LOG_NDEBUG +#ifdef NDEBUG +#define LOG_NDEBUG 1 +#else +#define LOG_NDEBUG 0 +#endif +#endif + +/* --------------------------------------------------------------------- */ + +/* + * Simplified macro to send a verbose radio log message using current LOG_TAG. + */ +#ifndef RLOGV +#define __RLOGV(...) \ + ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__)) +#if LOG_NDEBUG +#define RLOGV(...) do { if (0) { __RLOGV(__VA_ARGS__); } } while (0) +#else +#define RLOGV(...) __RLOGV(__VA_ARGS__) +#endif +#endif + +#ifndef RLOGV_IF +#if LOG_NDEBUG +#define RLOGV_IF(cond, ...) ((void)0) +#else +#define RLOGV_IF(cond, ...) \ + ( (__predict_false(cond)) \ + ? ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__)) \ + : (void)0 ) +#endif +#endif + +/* + * Simplified macro to send a debug radio log message using current LOG_TAG. + */ +#ifndef RLOGD +#define RLOGD(...) \ + ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)) +#endif + +#ifndef RLOGD_IF +#define RLOGD_IF(cond, ...) \ + ( (__predict_false(cond)) \ + ? ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)) \ + : (void)0 ) +#endif + +/* + * Simplified macro to send an info radio log message using current LOG_TAG. + */ +#ifndef RLOGI +#define RLOGI(...) \ + ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)) +#endif + +#ifndef RLOGI_IF +#define RLOGI_IF(cond, ...) \ + ( (__predict_false(cond)) \ + ? ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)) \ + : (void)0 ) +#endif + +/* + * Simplified macro to send a warning radio log message using current LOG_TAG. + */ +#ifndef RLOGW +#define RLOGW(...) \ + ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)) +#endif + +#ifndef RLOGW_IF +#define RLOGW_IF(cond, ...) \ + ( (__predict_false(cond)) \ + ? ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)) \ + : (void)0 ) +#endif + +/* + * Simplified macro to send an error radio log message using current LOG_TAG. + */ +#ifndef RLOGE +#define RLOGE(...) \ + ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)) +#endif + +#ifndef RLOGE_IF +#define RLOGE_IF(cond, ...) \ + ( (__predict_false(cond)) \ + ? ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)) \ + : (void)0 ) +#endif + +#endif /* _LIBS_LOG_LOG_RADIO_H */ diff --git a/liblog/include_vndk/android b/liblog/include_vndk/android index 69fbc0947..a3c0320f9 120000 --- a/liblog/include_vndk/android +++ b/liblog/include_vndk/android @@ -1 +1 @@ -../../include/android/ \ No newline at end of file +../include/android \ No newline at end of file diff --git a/liblog/include_vndk/log/log.h b/liblog/include_vndk/log/log.h index f3eb3fe14..1e3556c31 100644 --- a/liblog/include_vndk/log/log.h +++ b/liblog/include_vndk/log/log.h @@ -4,10 +4,9 @@ #define _LIBS_LOG_LOG_H #include - -/*The following files will be included once they are available*/ -/*#include */ -/*#include */ +#include +#include +#include /* * LOG_TAG is the local tag used for the following simplified diff --git a/liblog/include_vndk/log/log_id.h b/liblog/include_vndk/log/log_id.h new file mode 120000 index 000000000..dce92b991 --- /dev/null +++ b/liblog/include_vndk/log/log_id.h @@ -0,0 +1 @@ +../../include/log/log_id.h \ No newline at end of file diff --git a/liblog/include_vndk/log/log_main.h b/liblog/include_vndk/log/log_main.h new file mode 120000 index 000000000..f2ec01835 --- /dev/null +++ b/liblog/include_vndk/log/log_main.h @@ -0,0 +1 @@ +../../include/log/log_main.h \ No newline at end of file diff --git a/liblog/include_vndk/log/log_radio.h b/liblog/include_vndk/log/log_radio.h new file mode 120000 index 000000000..1e12b32d4 --- /dev/null +++ b/liblog/include_vndk/log/log_radio.h @@ -0,0 +1 @@ +../../include/log/log_radio.h \ No newline at end of file diff --git a/liblog/tests/Android.mk b/liblog/tests/Android.mk index ec5a99b97..1a685df63 100644 --- a/liblog/tests/Android.mk +++ b/liblog/tests/Android.mk @@ -55,7 +55,9 @@ test_c_flags := \ -fno-builtin \ test_src_files := \ - liblog_test.cpp + liblog_test.cpp \ + log_id_test.cpp \ + log_radio_test.cpp # to prevent breaking the build if bionic not relatively visible to us ifneq ($(wildcard $(LOCAL_PATH)/../../../../bionic/libc/bionic/libc_logging.cpp),) diff --git a/liblog/tests/liblog_test.cpp b/liblog/tests/liblog_test.cpp index ec0352eea..d03c6d150 100644 --- a/liblog/tests/liblog_test.cpp +++ b/liblog/tests/liblog_test.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -54,44 +55,6 @@ || (_rc == -EAGAIN)); \ _rc; }) -TEST(liblog, __android_log_buf_print) { -#ifdef __ANDROID__ - EXPECT_LT(0, __android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_INFO, - "TEST__android_log_buf_print", - "radio")); - usleep(1000); - EXPECT_LT(0, __android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_INFO, - "TEST__android_log_buf_print", - "system")); - usleep(1000); - EXPECT_LT(0, __android_log_buf_print(LOG_ID_MAIN, ANDROID_LOG_INFO, - "TEST__android_log_buf_print", - "main")); - usleep(1000); -#else - GTEST_LOG_(INFO) << "This test does nothing.\n"; -#endif -} - -TEST(liblog, __android_log_buf_write) { -#ifdef __ANDROID__ - EXPECT_LT(0, __android_log_buf_write(LOG_ID_RADIO, ANDROID_LOG_INFO, - "TEST__android_log_buf_write", - "radio")); - usleep(1000); - EXPECT_LT(0, __android_log_buf_write(LOG_ID_SYSTEM, ANDROID_LOG_INFO, - "TEST__android_log_buf_write", - "system")); - usleep(1000); - EXPECT_LT(0, __android_log_buf_write(LOG_ID_MAIN, ANDROID_LOG_INFO, - "TEST__android_log_buf_write", - "main")); - usleep(1000); -#else - GTEST_LOG_(INFO) << "This test does nothing.\n"; -#endif -} - TEST(liblog, __android_log_btwrite) { #ifdef __ANDROID__ int intBuf = 0xDEADBEEF; @@ -113,43 +76,6 @@ TEST(liblog, __android_log_btwrite) { #endif } -#ifdef __ANDROID__ -static void* ConcurrentPrintFn(void *arg) { - int ret = __android_log_buf_print(LOG_ID_MAIN, ANDROID_LOG_INFO, - "TEST__android_log_print", "Concurrent %" PRIuPTR, - reinterpret_cast(arg)); - return reinterpret_cast(ret); -} -#endif - -#define NUM_CONCURRENT 64 -#define _concurrent_name(a,n) a##__concurrent##n -#define concurrent_name(a,n) _concurrent_name(a,n) - -TEST(liblog, concurrent_name(__android_log_buf_print, NUM_CONCURRENT)) { -#ifdef __ANDROID__ - pthread_t t[NUM_CONCURRENT]; - int i; - for (i=0; i < NUM_CONCURRENT; i++) { - ASSERT_EQ(0, pthread_create(&t[i], NULL, - ConcurrentPrintFn, - reinterpret_cast(i))); - } - int ret = 0; - for (i=0; i < NUM_CONCURRENT; i++) { - void* result; - ASSERT_EQ(0, pthread_join(t[i], &result)); - int this_result = reinterpret_cast(result); - if ((0 == ret) && (0 != this_result)) { - ret = this_result; - } - } - ASSERT_LT(0, ret); -#else - GTEST_LOG_(INFO) << "This test does nothing.\n"; -#endif -} - #ifdef __ANDROID__ std::string popenToString(std::string command) { std::string ret; diff --git a/liblog/tests/log_id_test.cpp b/liblog/tests/log_id_test.cpp new file mode 100644 index 000000000..3241534f1 --- /dev/null +++ b/liblog/tests/log_id_test.cpp @@ -0,0 +1,125 @@ +/* + * Copyright (C) 2013-2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include + +#include +// Test the APIs in this standalone include file +#include + +// We do not want to include to acquire ANDROID_LOG_INFO for +// include file API purity. We do however want to allow the _option_ that +// log/log_id.h could include this file, or related content, in the future. +#ifndef __android_LogPriority_defined +# define ANDROID_LOG_INFO 4 +#endif + +TEST(liblog, log_id) { +#ifdef __ANDROID__ + int count = 0; + + for(int i = LOG_ID_MIN; i < LOG_ID_MAX; ++i) { + log_id_t id = static_cast(i); + const char *name = android_log_id_to_name(id); + if (id != android_name_to_log_id(name)) { + continue; + } + ++count; + fprintf(stderr, "log buffer %s\r", name); + } + ASSERT_EQ(LOG_ID_MAX, count); +#else + GTEST_LOG_(INFO) << "This test does nothing.\n"; +#endif +} + +TEST(liblog, __android_log_buf_print) { +#ifdef __ANDROID__ + EXPECT_LT(0, __android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_INFO, + "TEST__android_log_buf_print", + "radio")); + usleep(1000); + EXPECT_LT(0, __android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_INFO, + "TEST__android_log_buf_print", + "system")); + usleep(1000); + EXPECT_LT(0, __android_log_buf_print(LOG_ID_MAIN, ANDROID_LOG_INFO, + "TEST__android_log_buf_print", + "main")); + usleep(1000); +#else + GTEST_LOG_(INFO) << "This test does nothing.\n"; +#endif +} + +TEST(liblog, __android_log_buf_write) { +#ifdef __ANDROID__ + EXPECT_LT(0, __android_log_buf_write(LOG_ID_RADIO, ANDROID_LOG_INFO, + "TEST__android_log_buf_write", + "radio")); + usleep(1000); + EXPECT_LT(0, __android_log_buf_write(LOG_ID_SYSTEM, ANDROID_LOG_INFO, + "TEST__android_log_buf_write", + "system")); + usleep(1000); + EXPECT_LT(0, __android_log_buf_write(LOG_ID_MAIN, ANDROID_LOG_INFO, + "TEST__android_log_buf_write", + "main")); + usleep(1000); +#else + GTEST_LOG_(INFO) << "This test does nothing.\n"; +#endif +} + +#ifdef __ANDROID__ +static void* ConcurrentPrintFn(void *arg) { + int ret = __android_log_buf_print(LOG_ID_MAIN, ANDROID_LOG_INFO, + "TEST__android_log_print", "Concurrent %" PRIuPTR, + reinterpret_cast(arg)); + return reinterpret_cast(ret); +} +#endif + +#define NUM_CONCURRENT 64 +#define _concurrent_name(a,n) a##__concurrent##n +#define concurrent_name(a,n) _concurrent_name(a,n) + +TEST(liblog, concurrent_name(__android_log_buf_print, NUM_CONCURRENT)) { +#ifdef __ANDROID__ + pthread_t t[NUM_CONCURRENT]; + int i; + for (i=0; i < NUM_CONCURRENT; i++) { + ASSERT_EQ(0, pthread_create(&t[i], NULL, + ConcurrentPrintFn, + reinterpret_cast(i))); + } + int ret = 0; + for (i=0; i < NUM_CONCURRENT; i++) { + void* result; + ASSERT_EQ(0, pthread_join(t[i], &result)); + int this_result = reinterpret_cast(result); + if ((0 == ret) && (0 != this_result)) { + ret = this_result; + } + } + ASSERT_LT(0, ret); +#else + GTEST_LOG_(INFO) << "This test does nothing.\n"; +#endif +} diff --git a/liblog/tests/log_radio_test.cpp b/liblog/tests/log_radio_test.cpp new file mode 100644 index 000000000..591748ab2 --- /dev/null +++ b/liblog/tests/log_radio_test.cpp @@ -0,0 +1,117 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include + +#include + +#include +#include +#include +// Test the APIs in this standalone include file +#include + +TEST(liblog, RLOG) { +#ifdef __ANDROID__ + static const char content[] = "log_radio.h"; + static const char content_false[] = "log_radio.h false"; + + // ratelimit content to 10/s to keep away from spam filters + // do not send identical content together to keep away from spam filters + +#undef LOG_TAG +#define LOG_TAG "TEST__RLOGV" + RLOGV(content); + usleep(100000); +#undef LOG_TAG +#define LOG_TAG "TEST__RLOGD" + RLOGD(content); + usleep(100000); +#undef LOG_TAG +#define LOG_TAG "TEST__RLOGI" + RLOGI(content); + usleep(100000); +#undef LOG_TAG +#define LOG_TAG "TEST__RLOGW" + RLOGW(content); + usleep(100000); +#undef LOG_TAG +#define LOG_TAG "TEST__RLOGE" + RLOGE(content); + usleep(100000); +#undef LOG_TAG +#define LOG_TAG "TEST__RLOGV" + RLOGV_IF(true, content); + usleep(100000); + RLOGV_IF(false, content_false); + usleep(100000); +#undef LOG_TAG +#define LOG_TAG "TEST__RLOGD" + RLOGD_IF(true, content); + usleep(100000); + RLOGD_IF(false, content_false); + usleep(100000); +#undef LOG_TAG +#define LOG_TAG "TEST__RLOGI" + RLOGI_IF(true, content); + usleep(100000); + RLOGI_IF(false, content_false); + usleep(100000); +#undef LOG_TAG +#define LOG_TAG "TEST__RLOGW" + RLOGW_IF(true, content); + usleep(100000); + RLOGW_IF(false, content_false); + usleep(100000); +#undef LOG_TAG +#define LOG_TAG "TEST__RLOGE" + RLOGE_IF(true, content); + usleep(100000); + RLOGE_IF(false, content_false); + + // give time for content to long-path through logger + sleep(1); + + std::string buf = android::base::StringPrintf( + "logcat -b radio --pid=%u -d -s" + " TEST__RLOGV TEST__RLOGD TEST__RLOGI TEST__RLOGW TEST__RLOGE", + (unsigned)getpid()); + FILE* fp = popen(buf.c_str(), "r"); + int count = 0; + int count_false = 0; + if (fp) { + if (!android::base::ReadFdToString(fileno(fp), &buf)) buf = ""; + pclose(fp); + for (size_t pos = 0; (pos = buf.find(content, pos)) != std::string::npos; ++pos) { + ++count; + } + for (size_t pos = 0; (pos = buf.find(content_false, pos)) != std::string::npos; ++pos) { + ++count_false; + } + } + EXPECT_EQ(0, count_false); +#if LOG_NDEBUG + ASSERT_EQ(8, count); +#else + ASSERT_EQ(10, count); +#endif + +#else + GTEST_LOG_(INFO) << "This test does nothing.\n"; +#endif +}