diff options
-rw-r--r-- | liblog/Android.bp | 1 | ||||
-rw-r--r-- | liblog/README.md | 10 | ||||
-rw-r--r-- | liblog/config_write.cpp | 83 | ||||
-rw-r--r-- | liblog/config_write.h | 52 | ||||
-rw-r--r-- | liblog/fake_writer.cpp | 5 | ||||
-rw-r--r-- | liblog/include/log/log_transport.h | 34 | ||||
-rw-r--r-- | liblog/logd_reader.cpp | 1 | ||||
-rw-r--r-- | liblog/logd_writer.cpp | 5 | ||||
-rw-r--r-- | liblog/logger.h | 6 | ||||
-rw-r--r-- | liblog/logger_write.cpp | 222 | ||||
-rw-r--r-- | liblog/pmsg_reader.cpp | 1 | ||||
-rw-r--r-- | liblog/pmsg_writer.cpp | 5 | ||||
-rw-r--r-- | liblog/tests/liblog_benchmark.cpp | 32 | ||||
-rw-r--r-- | liblog/tests/log_wrap_test.cpp | 3 |
14 files changed, 65 insertions, 395 deletions
diff --git a/liblog/Android.bp b/liblog/Android.bp index 8a63007dc..c40c5ef8b 100644 --- a/liblog/Android.bp +++ b/liblog/Android.bp @@ -15,7 +15,6 @@ // liblog_sources = [ - "config_write.cpp", "log_event_list.cpp", "log_event_write.cpp", "logger_lock.cpp", diff --git a/liblog/README.md b/liblog/README.md index 98bee9f7d..871399a57 100644 --- a/liblog/README.md +++ b/liblog/README.md @@ -96,11 +96,6 @@ Public Functions and Macros int android_log_destroy(android_log_context *ctx) - #include <log/log_transport.h> - - int android_set_log_transport(int transport_flag) - int android_get_log_transport() - Description ----------- @@ -144,11 +139,6 @@ size and log buffer format protocol version respectively. `android_logger_get_i that was used when opening the sub-log. It is recommended to open the log `ANDROID_LOG_RDONLY` in these cases. -`android_set_log_transport()` selects transport filters. Argument is either `LOGGER_DEFAULT`, -`LOGGER_LOGD`, or `LOGGER_NULL`. Log to logger daemon for default or logd, or drop contents on floor -respectively. `Both android_set_log_transport()` and `android_get_log_transport()` return the -current transport mask, or a negative errno for any problems. - Errors ------ diff --git a/liblog/config_write.cpp b/liblog/config_write.cpp deleted file mode 100644 index 6ed893dbd..000000000 --- a/liblog/config_write.cpp +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (C) 2016 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 <log/log_transport.h> - -#include "config_write.h" -#include "logger.h" - -struct listnode __android_log_transport_write = {&__android_log_transport_write, - &__android_log_transport_write}; -struct listnode __android_log_persist_write = {&__android_log_persist_write, - &__android_log_persist_write}; - -static void __android_log_add_transport(struct listnode* list, - struct android_log_transport_write* transport) { - uint32_t i; - - /* Try to keep one functioning transport for each log buffer id */ - for (i = LOG_ID_MIN; i < LOG_ID_MAX; i++) { - struct android_log_transport_write* transp; - - if (list_empty(list)) { - if (!transport->available || ((*transport->available)(static_cast<log_id_t>(i)) >= 0)) { - list_add_tail(list, &transport->node); - return; - } - } else { - write_transport_for_each(transp, list) { - if (!transp->available) { - return; - } - if (((*transp->available)(static_cast<log_id_t>(i)) < 0) && - (!transport->available || ((*transport->available)(static_cast<log_id_t>(i)) >= 0))) { - list_add_tail(list, &transport->node); - return; - } - } - } - } -} - -void __android_log_config_write() { - if ((__android_log_transport == LOGGER_DEFAULT) || (__android_log_transport & LOGGER_LOGD)) { -#if (FAKE_LOG_DEVICE == 0) - extern struct android_log_transport_write logdLoggerWrite; - extern struct android_log_transport_write pmsgLoggerWrite; - - __android_log_add_transport(&__android_log_transport_write, &logdLoggerWrite); - __android_log_add_transport(&__android_log_persist_write, &pmsgLoggerWrite); -#else - extern struct android_log_transport_write fakeLoggerWrite; - - __android_log_add_transport(&__android_log_transport_write, &fakeLoggerWrite); -#endif - } -} - -void __android_log_config_write_close() { - struct android_log_transport_write* transport; - struct listnode* n; - - write_transport_for_each_safe(transport, n, &__android_log_transport_write) { - transport->logMask = 0; - list_remove(&transport->node); - } - write_transport_for_each_safe(transport, n, &__android_log_persist_write) { - transport->logMask = 0; - list_remove(&transport->node); - } -} diff --git a/liblog/config_write.h b/liblog/config_write.h deleted file mode 100644 index a901f1352..000000000 --- a/liblog/config_write.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) 2016 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. - */ - -#pragma once - -#include <cutils/list.h> - -#include "log_portability.h" - -__BEGIN_DECLS - -extern struct listnode __android_log_transport_write; -extern struct listnode __android_log_persist_write; - -#define write_transport_for_each(transp, transports) \ - for ((transp) = node_to_item((transports)->next, \ - struct android_log_transport_write, node); \ - ((transp) != node_to_item((transports), \ - struct android_log_transport_write, node)) && \ - ((transp) != node_to_item((transp)->node.next, \ - struct android_log_transport_write, node)); \ - (transp) = node_to_item((transp)->node.next, \ - struct android_log_transport_write, node)) - -#define write_transport_for_each_safe(transp, n, transports) \ - for ((transp) = node_to_item((transports)->next, \ - struct android_log_transport_write, node), \ - (n) = (transp)->node.next; \ - ((transp) != node_to_item((transports), \ - struct android_log_transport_write, node)) && \ - ((transp) != \ - node_to_item((n), struct android_log_transport_write, node)); \ - (transp) = node_to_item((n), struct android_log_transport_write, node), \ - (n) = (transp)->node.next) - -void __android_log_config_write(); -void __android_log_config_write_close(); - -__END_DECLS diff --git a/liblog/fake_writer.cpp b/liblog/fake_writer.cpp index c0b0e69a5..4d07caad8 100644 --- a/liblog/fake_writer.cpp +++ b/liblog/fake_writer.cpp @@ -20,7 +20,6 @@ #include <log/log.h> -#include "config_write.h" #include "fake_log_device.h" #include "log_portability.h" #include "logger.h" @@ -32,9 +31,9 @@ static int fakeWrite(log_id_t log_id, struct timespec* ts, struct iovec* vec, si static int logFds[(int)LOG_ID_MAX] = {-1, -1, -1, -1, -1, -1}; struct android_log_transport_write fakeLoggerWrite = { - .node = {&fakeLoggerWrite.node, &fakeLoggerWrite.node}, - .context.priv = &logFds, .name = "fake", + .logMask = 0, + .context.priv = &logFds, .available = NULL, .open = fakeOpen, .close = fakeClose, diff --git a/liblog/include/log/log_transport.h b/liblog/include/log/log_transport.h deleted file mode 100644 index bda7c2579..000000000 --- a/liblog/include/log/log_transport.h +++ /dev/null @@ -1,34 +0,0 @@ -/* -** -** Copyright 2017, The Android Open Source Project -** -** This file is dual licensed. It may be redistributed and/or modified -** under the terms of the Apache 2.0 License OR version 2 of the GNU -** General Public License. -*/ - -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Logging transports, bit mask to select features. Function returns selection. - */ -/* clang-format off */ -#define LOGGER_DEFAULT 0x00 -#define LOGGER_LOGD 0x01 -#define LOGGER_KERNEL 0x02 /* Reserved/Deprecated */ -#define LOGGER_NULL 0x04 /* Does not release resources of other selections */ -#define LOGGER_RESERVED 0x08 /* Reserved, previously for logging to local memory */ -#define LOGGER_RESERVED2 0x10 /* Reserved, previously for logs sent to stderr */ -/* clang-format on */ - -/* Both return the selected transport flag mask, or negative errno */ -int android_set_log_transport(int transport_flag); -int android_get_log_transport(); - -#ifdef __cplusplus -} -#endif diff --git a/liblog/logd_reader.cpp b/liblog/logd_reader.cpp index d5bf84405..e372dcefd 100644 --- a/liblog/logd_reader.cpp +++ b/liblog/logd_reader.cpp @@ -66,7 +66,6 @@ static ssize_t logdGetStats(struct android_log_logger_list* logger, struct android_log_transport_context* transp, char* buf, size_t len); struct android_log_transport_read logdLoggerRead = { - .node = {&logdLoggerRead.node, &logdLoggerRead.node}, .name = "logd", .available = logdAvailable, .version = logdVersion, diff --git a/liblog/logd_writer.cpp b/liblog/logd_writer.cpp index 2c64b0b89..09aaffb09 100644 --- a/liblog/logd_writer.cpp +++ b/liblog/logd_writer.cpp @@ -34,7 +34,6 @@ #include <private/android_filesystem_config.h> #include <private/android_logger.h> -#include "config_write.h" #include "log_portability.h" #include "logger.h" #include "uio.h" @@ -48,9 +47,9 @@ static void logdClose(); static int logdWrite(log_id_t logId, struct timespec* ts, struct iovec* vec, size_t nr); struct android_log_transport_write logdLoggerWrite = { - .node = {&logdLoggerWrite.node, &logdLoggerWrite.node}, - .context.sock = -EBADF, .name = "logd", + .logMask = 0, + .context.sock = -EBADF, .available = logdAvailable, .open = logdOpen, .close = logdClose, diff --git a/liblog/logger.h b/liblog/logger.h index 4b4ef5fc3..8cae66c88 100644 --- a/liblog/logger.h +++ b/liblog/logger.h @@ -31,12 +31,9 @@ union android_log_context_union { void* priv; atomic_int sock; atomic_int fd; - struct listnode* node; - atomic_uintptr_t atomic_pointer; }; struct android_log_transport_write { - struct listnode node; const char* name; /* human name to describe the transport */ unsigned logMask; /* mask cache of available() success */ union android_log_context_union context; /* Initialized by static allocation */ @@ -54,7 +51,6 @@ struct android_log_transport_context; struct android_log_logger; struct android_log_transport_read { - struct listnode node; const char* name; /* human name to describe the transport */ /* Does not cause resources to be taken */ @@ -149,6 +145,4 @@ void __android_log_lock(); int __android_log_trylock(); void __android_log_unlock(); -extern int __android_log_transport; - __END_DECLS diff --git a/liblog/logger_write.cpp b/liblog/logger_write.cpp index 7fc87477e..abcead7b6 100644 --- a/liblog/logger_write.cpp +++ b/liblog/logger_write.cpp @@ -25,17 +25,18 @@ #endif #include <log/event_tag_map.h> -#include <log/log_transport.h> #include <private/android_filesystem_config.h> #include <private/android_logger.h> -#include "config_write.h" #include "log_portability.h" #include "logger.h" #include "uio.h" #define LOG_BUF_SIZE 1024 +android_log_transport_write* android_log_write = nullptr; +android_log_transport_write* android_log_persist_write = nullptr; + static int __write_to_log_init(log_id_t, struct iovec* vec, size_t nr); static int (*write_to_log)(log_id_t, struct iovec* vec, size_t nr) = __write_to_log_init; @@ -105,7 +106,6 @@ static atomic_uintptr_t tagMap; * Release any logger resources. A new log write will immediately re-acquire. */ void __android_log_close() { - struct android_log_transport_write* transport; #if defined(__ANDROID__) EventTagMap* m; #endif @@ -124,19 +124,16 @@ void __android_log_close() { * disengenuous use of this function. */ - write_transport_for_each(transport, &__android_log_persist_write) { - if (transport->close) { - (*transport->close)(); - } + if (android_log_write != nullptr) { + android_log_write->close(); } - write_transport_for_each(transport, &__android_log_transport_write) { - if (transport->close) { - (*transport->close)(); - } + if (android_log_persist_write != nullptr) { + android_log_persist_write->close(); } - __android_log_config_write_close(); + android_log_write = nullptr; + android_log_persist_write = nullptr; #if defined(__ANDROID__) /* @@ -161,52 +158,52 @@ void __android_log_close() { #endif } -/* log_init_lock assumed */ -static int __write_to_log_initialize() { - struct android_log_transport_write* transport; - struct listnode* n; - int i = 0, ret = 0; - - __android_log_config_write(); - write_transport_for_each_safe(transport, n, &__android_log_transport_write) { - __android_log_cache_available(transport); - if (!transport->logMask) { - list_remove(&transport->node); - continue; - } - if (!transport->open || ((*transport->open)() < 0)) { - if (transport->close) { - (*transport->close)(); - } - list_remove(&transport->node); - continue; - } - ++ret; +static bool transport_initialize(android_log_transport_write* transport) { + if (transport == nullptr) { + return false; } - write_transport_for_each_safe(transport, n, &__android_log_persist_write) { - __android_log_cache_available(transport); - if (!transport->logMask) { - list_remove(&transport->node); - continue; - } - if (!transport->open || ((*transport->open)() < 0)) { - if (transport->close) { - (*transport->close)(); - } - list_remove(&transport->node); - continue; - } - ++i; + + __android_log_cache_available(transport); + if (!transport->logMask) { + return false; + } + + // TODO: Do we actually need to call close() if open() fails? + if (transport->open() < 0) { + transport->close(); + return false; } - if (!ret && !i) { + + return true; +} + +/* log_init_lock assumed */ +static int __write_to_log_initialize() { +#if (FAKE_LOG_DEVICE == 0) + extern struct android_log_transport_write logdLoggerWrite; + extern struct android_log_transport_write pmsgLoggerWrite; + + android_log_write = &logdLoggerWrite; + android_log_persist_write = &pmsgLoggerWrite; +#else + extern struct android_log_transport_write fakeLoggerWrite; + + android_log_write = &fakeLoggerWrite; +#endif + + if (!transport_initialize(android_log_write)) { + android_log_write = nullptr; return -ENODEV; } - return ret; + if (!transport_initialize(android_log_persist_write)) { + android_log_persist_write = nullptr; + } + + return 1; } static int __write_to_log_daemon(log_id_t log_id, struct iovec* vec, size_t nr) { - struct android_log_transport_write* node; int ret, save_errno; struct timespec ts; size_t len, i; @@ -283,28 +280,11 @@ static int __write_to_log_daemon(log_id_t log_id, struct iovec* vec, size_t nr) return -EPERM; } } else { - /* Validate the incoming tag, tag content can not split across iovec */ - char prio = ANDROID_LOG_VERBOSE; - const char* tag = static_cast<const char*>(vec[0].iov_base); - size_t len = vec[0].iov_len; - if (!tag) { - len = 0; - } - if (len > 0) { - prio = *tag; - if (len > 1) { - --len; - ++tag; - } else { - len = vec[1].iov_len; - tag = ((const char*)vec[1].iov_base); - if (!tag) { - len = 0; - } - } - } + int prio = *static_cast<int*>(vec[0].iov_base); + const char* tag = static_cast<const char*>(vec[1].iov_base); + size_t len = vec[1].iov_len; /* tag must be nul terminated */ - if (tag && strnlen(tag, len) >= len) { + if (strnlen(tag, len) >= len) { tag = NULL; } @@ -325,20 +305,17 @@ static int __write_to_log_daemon(log_id_t log_id, struct iovec* vec, size_t nr) ret = 0; i = 1 << log_id; - write_transport_for_each(node, &__android_log_transport_write) { - if (node->logMask & i) { - ssize_t retval; - retval = (*node->write)(log_id, &ts, vec, nr); - if (ret >= 0) { - ret = retval; - } + + if (android_log_write != nullptr && (android_log_write->logMask & i)) { + ssize_t retval; + retval = android_log_write->write(log_id, &ts, vec, nr); + if (ret >= 0) { + ret = retval; } } - write_transport_for_each(node, &__android_log_persist_write) { - if (node->logMask & i) { - (void)(*node->write)(log_id, &ts, vec, nr); - } + if (android_log_persist_write != nullptr && (android_log_persist_write->logMask & i)) { + android_log_persist_write->write(log_id, &ts, vec, nr); } errno = save_errno; @@ -354,9 +331,6 @@ static int __write_to_log_init(log_id_t log_id, struct iovec* vec, size_t nr) { ret = __write_to_log_initialize(); if (ret < 0) { __android_log_unlock(); - if (!list_empty(&__android_log_persist_write)) { - __write_to_log_daemon(log_id, vec, nr); - } errno = save_errno; return ret; } @@ -546,81 +520,3 @@ int __android_log_security_bswrite(int32_t tag, const char* payload) { return write_to_log(LOG_ID_SECURITY, vec, 4); } - -static int __write_to_log_null(log_id_t log_id, struct iovec* vec, size_t nr) { - size_t len, i; - - if ((log_id < LOG_ID_MIN) || (log_id >= LOG_ID_MAX)) { - return -EINVAL; - } - - for (len = i = 0; i < nr; ++i) { - len += vec[i].iov_len; - } - if (!len) { - return -EINVAL; - } - return len; -} - -/* Following functions need access to our internal write_to_log status */ - -int __android_log_transport; - -int android_set_log_transport(int transport_flag) { - int retval; - - if (transport_flag < 0) { - return -EINVAL; - } - - retval = LOGGER_NULL; - - __android_log_lock(); - - if (transport_flag & LOGGER_NULL) { - write_to_log = __write_to_log_null; - - __android_log_unlock(); - - return retval; - } - - __android_log_transport &= LOGGER_LOGD; - - transport_flag &= LOGGER_LOGD; - - if (__android_log_transport != transport_flag) { - __android_log_transport = transport_flag; - __android_log_config_write_close(); - - write_to_log = __write_to_log_init; - /* generically we only expect these two values for write_to_log */ - } else if ((write_to_log != __write_to_log_init) && (write_to_log != __write_to_log_daemon)) { - write_to_log = __write_to_log_init; - } - - retval = __android_log_transport; - - __android_log_unlock(); - - return retval; -} - -int android_get_log_transport() { - int ret = LOGGER_DEFAULT; - - __android_log_lock(); - if (write_to_log == __write_to_log_null) { - ret = LOGGER_NULL; - } else { - __android_log_transport &= LOGGER_LOGD; - ret = __android_log_transport; - if ((write_to_log != __write_to_log_init) && (write_to_log != __write_to_log_daemon)) { - ret = -EINVAL; - } - } - __android_log_unlock(); - - return ret; -} diff --git a/liblog/pmsg_reader.cpp b/liblog/pmsg_reader.cpp index 005fec802..2db45a144 100644 --- a/liblog/pmsg_reader.cpp +++ b/liblog/pmsg_reader.cpp @@ -37,7 +37,6 @@ static int pmsgClear(struct android_log_logger* logger, struct android_log_transport_context* transp); struct android_log_transport_read pmsgLoggerRead = { - .node = {&pmsgLoggerRead.node, &pmsgLoggerRead.node}, .name = "pmsg", .available = pmsgAvailable, .version = pmsgVersion, diff --git a/liblog/pmsg_writer.cpp b/liblog/pmsg_writer.cpp index 69720ed65..f74fd4c57 100644 --- a/liblog/pmsg_writer.cpp +++ b/liblog/pmsg_writer.cpp @@ -29,7 +29,6 @@ #include <private/android_filesystem_config.h> #include <private/android_logger.h> -#include "config_write.h" #include "log_portability.h" #include "logger.h" #include "uio.h" @@ -40,9 +39,9 @@ static int pmsgAvailable(log_id_t logId); static int pmsgWrite(log_id_t logId, struct timespec* ts, struct iovec* vec, size_t nr); struct android_log_transport_write pmsgLoggerWrite = { - .node = {&pmsgLoggerWrite.node, &pmsgLoggerWrite.node}, - .context.fd = -1, .name = "pmsg", + .logMask = 0, + .context.fd = -1, .available = pmsgAvailable, .open = pmsgOpen, .close = pmsgClose, diff --git a/liblog/tests/liblog_benchmark.cpp b/liblog/tests/liblog_benchmark.cpp index 71637434d..4642b9bf4 100644 --- a/liblog/tests/liblog_benchmark.cpp +++ b/liblog/tests/liblog_benchmark.cpp @@ -29,7 +29,6 @@ #include <benchmark/benchmark.h> #include <cutils/sockets.h> #include <log/event_tag_map.h> -#include <log/log_transport.h> #include <private/android_logger.h> BENCHMARK_MAIN(); @@ -73,21 +72,6 @@ static void BM_log_maximum(benchmark::State& state) { } BENCHMARK(BM_log_maximum); -static void set_log_null() { - android_set_log_transport(LOGGER_NULL); -} - -static void set_log_default() { - android_set_log_transport(LOGGER_DEFAULT); -} - -static void BM_log_maximum_null(benchmark::State& state) { - set_log_null(); - BM_log_maximum(state); - set_log_default(); -} -BENCHMARK(BM_log_maximum_null); - /* * Measure the time it takes to collect the time using * discrete acquisition (state.PauseTiming() to state.ResumeTiming()) @@ -618,13 +602,6 @@ static void BM_log_event_overhead_42(benchmark::State& state) { } BENCHMARK(BM_log_event_overhead_42); -static void BM_log_event_overhead_null(benchmark::State& state) { - set_log_null(); - BM_log_event_overhead(state); - set_log_default(); -} -BENCHMARK(BM_log_event_overhead_null); - /* * Measure the time it takes to submit the android event logging call * using discrete acquisition under very-light load (<1% CPU utilization). @@ -639,15 +616,6 @@ static void BM_log_light_overhead(benchmark::State& state) { } BENCHMARK(BM_log_light_overhead); -static void BM_log_light_overhead_null(benchmark::State& state) { - set_log_null(); - BM_log_light_overhead(state); - set_log_default(); -} -// Default gets out of hand for this test, so we set a reasonable number of -// iterations for a timely result. -BENCHMARK(BM_log_light_overhead_null)->Iterations(500); - static void caught_latency(int /*signum*/) { unsigned long long v = 0xDEADBEEFA55A5AA5ULL; diff --git a/liblog/tests/log_wrap_test.cpp b/liblog/tests/log_wrap_test.cpp index ebf0b1505..c7dd8e812 100644 --- a/liblog/tests/log_wrap_test.cpp +++ b/liblog/tests/log_wrap_test.cpp @@ -27,12 +27,9 @@ #include <log/log_properties.h> #include <log/log_read.h> #include <log/log_time.h> -#include <log/log_transport.h> #ifdef __ANDROID__ static void read_with_wrap() { - android_set_log_transport(LOGGER_LOGD); - // Read the last line in the log to get a starting timestamp. We're assuming // the log is not empty. const int mode = ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK; |