diff --git a/liblog/include/log/log.h b/liblog/include/log/log.h index e592c5c6d..6a7450cc5 100644 --- a/liblog/include/log/log.h +++ b/liblog/include/log/log.h @@ -30,6 +30,7 @@ #include #include #include +#include #include /* helper to define iovec for portability */ #ifdef __cplusplus @@ -161,92 +162,6 @@ extern "C" { /* --------------------------------------------------------------------- */ -/* - * 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. */ 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/log/log.h b/liblog/include_vndk/log/log.h index 7a776d8d4..1e3556c31 100644 --- a/liblog/include_vndk/log/log.h +++ b/liblog/include_vndk/log/log.h @@ -6,9 +6,7 @@ #include #include #include - -/*The following files will be included once they are available*/ -/*#include */ +#include /* * LOG_TAG is the local tag used for the following simplified 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 6eba86e90..1a685df63 100644 --- a/liblog/tests/Android.mk +++ b/liblog/tests/Android.mk @@ -56,7 +56,8 @@ test_c_flags := \ test_src_files := \ liblog_test.cpp \ - log_id_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/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 +}