diff --git a/liblog/include/log/log.h b/liblog/include/log/log.h index 6a7450cc5..36c1e682e 100644 --- a/liblog/include/log/log.h +++ b/liblog/include/log/log.h @@ -31,6 +31,7 @@ #include #include #include +#include #include /* helper to define iovec for portability */ #ifdef __cplusplus @@ -76,90 +77,6 @@ extern "C" { #pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments" #endif -/* - * Simplified macro to send a verbose system log message using current LOG_TAG. - */ -#ifndef SLOGV -#define __SLOGV(...) \ - ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__)) -#if LOG_NDEBUG -#define SLOGV(...) do { if (0) { __SLOGV(__VA_ARGS__); } } while (0) -#else -#define SLOGV(...) __SLOGV(__VA_ARGS__) -#endif -#endif - -#ifndef SLOGV_IF -#if LOG_NDEBUG -#define SLOGV_IF(cond, ...) ((void)0) -#else -#define SLOGV_IF(cond, ...) \ - ( (__predict_false(cond)) \ - ? ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__)) \ - : (void)0 ) -#endif -#endif - -/* - * Simplified macro to send a debug system log message using current LOG_TAG. - */ -#ifndef SLOGD -#define SLOGD(...) \ - ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)) -#endif - -#ifndef SLOGD_IF -#define SLOGD_IF(cond, ...) \ - ( (__predict_false(cond)) \ - ? ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)) \ - : (void)0 ) -#endif - -/* - * Simplified macro to send an info system log message using current LOG_TAG. - */ -#ifndef SLOGI -#define SLOGI(...) \ - ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)) -#endif - -#ifndef SLOGI_IF -#define SLOGI_IF(cond, ...) \ - ( (__predict_false(cond)) \ - ? ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)) \ - : (void)0 ) -#endif - -/* - * Simplified macro to send a warning system log message using current LOG_TAG. - */ -#ifndef SLOGW -#define SLOGW(...) \ - ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)) -#endif - -#ifndef SLOGW_IF -#define SLOGW_IF(cond, ...) \ - ( (__predict_false(cond)) \ - ? ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)) \ - : (void)0 ) -#endif - -/* - * Simplified macro to send an error system log message using current LOG_TAG. - */ -#ifndef SLOGE -#define SLOGE(...) \ - ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)) -#endif - -#ifndef SLOGE_IF -#define SLOGE_IF(cond, ...) \ - ( (__predict_false(cond)) \ - ? ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)) \ - : (void)0 ) -#endif - /* --------------------------------------------------------------------- */ /* diff --git a/liblog/include/log/log_system.h b/liblog/include/log/log_system.h new file mode 100644 index 000000000..8c1ec96e8 --- /dev/null +++ b/liblog/include/log/log_system.h @@ -0,0 +1,123 @@ +/* + * 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_SYSTEM_H +#define _LIBS_LOG_LOG_SYSTEM_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 system log message using current LOG_TAG. + */ +#ifndef SLOGV +#define __SLOGV(...) \ + ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__)) +#if LOG_NDEBUG +#define SLOGV(...) do { if (0) { __SLOGV(__VA_ARGS__); } } while (0) +#else +#define SLOGV(...) __SLOGV(__VA_ARGS__) +#endif +#endif + +#ifndef SLOGV_IF +#if LOG_NDEBUG +#define SLOGV_IF(cond, ...) ((void)0) +#else +#define SLOGV_IF(cond, ...) \ + ( (__predict_false(cond)) \ + ? ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__)) \ + : (void)0 ) +#endif +#endif + +/* + * Simplified macro to send a debug system log message using current LOG_TAG. + */ +#ifndef SLOGD +#define SLOGD(...) \ + ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)) +#endif + +#ifndef SLOGD_IF +#define SLOGD_IF(cond, ...) \ + ( (__predict_false(cond)) \ + ? ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)) \ + : (void)0 ) +#endif + +/* + * Simplified macro to send an info system log message using current LOG_TAG. + */ +#ifndef SLOGI +#define SLOGI(...) \ + ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)) +#endif + +#ifndef SLOGI_IF +#define SLOGI_IF(cond, ...) \ + ( (__predict_false(cond)) \ + ? ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)) \ + : (void)0 ) +#endif + +/* + * Simplified macro to send a warning system log message using current LOG_TAG. + */ +#ifndef SLOGW +#define SLOGW(...) \ + ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)) +#endif + +#ifndef SLOGW_IF +#define SLOGW_IF(cond, ...) \ + ( (__predict_false(cond)) \ + ? ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)) \ + : (void)0 ) +#endif + +/* + * Simplified macro to send an error system log message using current LOG_TAG. + */ +#ifndef SLOGE +#define SLOGE(...) \ + ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)) +#endif + +#ifndef SLOGE_IF +#define SLOGE_IF(cond, ...) \ + ( (__predict_false(cond)) \ + ? ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)) \ + : (void)0 ) +#endif + +#endif /* _LIBS_LOG_LOG_SYSTEM_H */ diff --git a/liblog/tests/Android.mk b/liblog/tests/Android.mk index 1a685df63..7bbf86d57 100644 --- a/liblog/tests/Android.mk +++ b/liblog/tests/Android.mk @@ -57,7 +57,8 @@ test_c_flags := \ test_src_files := \ liblog_test.cpp \ log_id_test.cpp \ - log_radio_test.cpp + log_radio_test.cpp \ + log_system_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_system_test.cpp b/liblog/tests/log_system_test.cpp new file mode 100644 index 000000000..b62832ec6 --- /dev/null +++ b/liblog/tests/log_system_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, SLOG) { +#ifdef __ANDROID__ + static const char content[] = "log_system.h"; + static const char content_false[] = "log_system.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__SLOGV" + SLOGV(content); + usleep(100000); +#undef LOG_TAG +#define LOG_TAG "TEST__SLOGD" + SLOGD(content); + usleep(100000); +#undef LOG_TAG +#define LOG_TAG "TEST__SLOGI" + SLOGI(content); + usleep(100000); +#undef LOG_TAG +#define LOG_TAG "TEST__SLOGW" + SLOGW(content); + usleep(100000); +#undef LOG_TAG +#define LOG_TAG "TEST__SLOGE" + SLOGE(content); + usleep(100000); +#undef LOG_TAG +#define LOG_TAG "TEST__SLOGV" + SLOGV_IF(true, content); + usleep(100000); + SLOGV_IF(false, content_false); + usleep(100000); +#undef LOG_TAG +#define LOG_TAG "TEST__SLOGD" + SLOGD_IF(true, content); + usleep(100000); + SLOGD_IF(false, content_false); + usleep(100000); +#undef LOG_TAG +#define LOG_TAG "TEST__SLOGI" + SLOGI_IF(true, content); + usleep(100000); + SLOGI_IF(false, content_false); + usleep(100000); +#undef LOG_TAG +#define LOG_TAG "TEST__SLOGW" + SLOGW_IF(true, content); + usleep(100000); + SLOGW_IF(false, content_false); + usleep(100000); +#undef LOG_TAG +#define LOG_TAG "TEST__SLOGE" + SLOGE_IF(true, content); + usleep(100000); + SLOGE_IF(false, content_false); + + // give time for content to long-path through logger + sleep(1); + + std::string buf = android::base::StringPrintf( + "logcat -b system --pid=%u -d -s" + " TEST__SLOGV TEST__SLOGD TEST__SLOGI TEST__SLOGW TEST__SLOGE", + (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 +}