These historically used atomics to manage their lifetime. They were unfortunately unsafe and later replace with a RwLock. A lock is also problematic as it is too heavy weight for the typical use case and implies that logging is neither async nor fork safe. This change returns us to using atomics with two key changes: 1) compare_exchange_strong() is used instead of atomic_exchange(). The latter has a race condition where a separate thread could have read the atomic value into a register, while the thread performing the atomic_exchange closes that FD. The new code only changes the FD in the atomic if it is uninitialized. 2) Using the fact that DGRAM sockets can have connect() called on them multiple times, it uses a single logd_socket for the duration of the program. These sockets are thread/async/fork safely created and accessed. The one caveat is __android_log_close(), which is intended only to be used by zygote when it is single threaded and is therefore not thread safe. It will close this socket and reset the underlying variable, such that the next log message will go through the above initialization. Bug: 65062446 Test: logging works, logging unit tests Test: new unit test Change-Id: Ia4dbf7479dbe50683d124558ab2f83bff53b8f5f
113 lines
2.7 KiB
Text
113 lines
2.7 KiB
Text
//
|
|
// Copyright (C) 2013-2014 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.
|
|
//
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// Benchmarks.
|
|
// -----------------------------------------------------------------------------
|
|
|
|
// Build benchmarks for the device. Run with:
|
|
// adb shell liblog-benchmarks
|
|
cc_benchmark {
|
|
name: "liblog-benchmarks",
|
|
cflags: [
|
|
"-Wall",
|
|
"-Wextra",
|
|
"-Werror",
|
|
"-fno-builtin",
|
|
],
|
|
shared_libs: [
|
|
"libm",
|
|
"libbase",
|
|
"libcutils",
|
|
],
|
|
static_libs: ["liblog"],
|
|
srcs: ["liblog_benchmark.cpp"],
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// Unit tests.
|
|
// -----------------------------------------------------------------------------
|
|
|
|
cc_defaults {
|
|
name: "liblog-tests-defaults",
|
|
|
|
cflags: [
|
|
"-fstack-protector-all",
|
|
"-g",
|
|
"-Wall",
|
|
"-Wextra",
|
|
"-Werror",
|
|
"-fno-builtin",
|
|
],
|
|
srcs: [
|
|
"libc_test.cpp",
|
|
"liblog_default_tag.cpp",
|
|
"liblog_global_state.cpp",
|
|
"liblog_test.cpp",
|
|
"log_id_test.cpp",
|
|
"log_radio_test.cpp",
|
|
"log_read_test.cpp",
|
|
"log_system_test.cpp",
|
|
"log_time_test.cpp",
|
|
"log_wrap_test.cpp",
|
|
"logd_writer_test.cpp",
|
|
"logprint_test.cpp",
|
|
],
|
|
shared_libs: [
|
|
"libcutils",
|
|
"libbase",
|
|
],
|
|
static_libs: ["liblog"],
|
|
isolated: true,
|
|
}
|
|
|
|
// Build tests for the device (with .so). Run with:
|
|
// adb shell /data/nativetest/liblog-unit-tests/liblog-unit-tests
|
|
cc_test {
|
|
name: "liblog-unit-tests",
|
|
defaults: ["liblog-tests-defaults"],
|
|
}
|
|
|
|
cc_test {
|
|
name: "CtsLiblogTestCases",
|
|
defaults: ["liblog-tests-defaults"],
|
|
multilib: {
|
|
lib32: {
|
|
suffix: "32",
|
|
},
|
|
lib64: {
|
|
suffix: "64",
|
|
},
|
|
},
|
|
|
|
cflags: ["-DNO_PSTORE"],
|
|
test_suites: [
|
|
"cts",
|
|
"vts10",
|
|
],
|
|
}
|
|
|
|
cc_test_host {
|
|
name: "liblog-host-test",
|
|
static_libs: ["liblog"],
|
|
shared_libs: ["libbase"],
|
|
srcs: [
|
|
"liblog_host_test.cpp",
|
|
"liblog_default_tag.cpp",
|
|
"liblog_global_state.cpp",
|
|
],
|
|
isolated: true,
|
|
}
|