2016-07-11 23:15:31 +02:00
|
|
|
//
|
|
|
|
// Copyright (C) 2015 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.
|
|
|
|
//
|
|
|
|
|
2017-10-03 00:20:07 +02:00
|
|
|
cc_defaults {
|
2018-02-15 20:40:30 +01:00
|
|
|
name: "libbase_cflags_defaults",
|
2018-02-17 02:58:14 +01:00
|
|
|
cflags: [
|
|
|
|
"-Wall",
|
|
|
|
"-Werror",
|
|
|
|
"-Wextra",
|
|
|
|
],
|
2019-09-12 00:31:55 +02:00
|
|
|
target: {
|
|
|
|
android: {
|
|
|
|
cflags: [
|
|
|
|
"-D_FILE_OFFSET_BITS=64",
|
|
|
|
],
|
|
|
|
},
|
|
|
|
},
|
2017-10-03 00:20:07 +02:00
|
|
|
}
|
2016-07-11 23:15:31 +02:00
|
|
|
|
2017-04-14 09:54:46 +02:00
|
|
|
cc_library_headers {
|
|
|
|
name: "libbase_headers",
|
|
|
|
vendor_available: true,
|
2020-01-22 03:17:19 +01:00
|
|
|
ramdisk_available: true,
|
2018-04-27 14:48:43 +02:00
|
|
|
recovery_available: true,
|
2017-04-14 09:54:46 +02:00
|
|
|
host_supported: true,
|
2019-05-06 14:01:58 +02:00
|
|
|
native_bridge_supported: true,
|
2017-04-14 09:54:46 +02:00
|
|
|
export_include_dirs: ["include"],
|
|
|
|
|
|
|
|
target: {
|
|
|
|
linux_bionic: {
|
|
|
|
enabled: true,
|
|
|
|
},
|
|
|
|
windows: {
|
|
|
|
enabled: true,
|
|
|
|
},
|
|
|
|
},
|
2020-03-07 08:36:09 +01:00
|
|
|
apex_available: [
|
|
|
|
"//apex_available:anyapex",
|
|
|
|
"//apex_available:platform",
|
|
|
|
],
|
2020-04-16 11:48:33 +02:00
|
|
|
min_sdk_version: "29",
|
2017-04-14 09:54:46 +02:00
|
|
|
}
|
|
|
|
|
2018-02-15 20:40:30 +01:00
|
|
|
cc_defaults {
|
|
|
|
name: "libbase_defaults",
|
|
|
|
defaults: ["libbase_cflags_defaults"],
|
2016-07-11 23:15:31 +02:00
|
|
|
srcs: [
|
2019-04-25 23:04:57 +02:00
|
|
|
"abi_compatibility.cpp",
|
2018-02-05 16:41:31 +01:00
|
|
|
"chrono_utils.cpp",
|
2019-01-08 04:16:21 +01:00
|
|
|
"cmsg.cpp",
|
2016-07-11 23:15:31 +02:00
|
|
|
"file.cpp",
|
2020-01-08 23:47:42 +01:00
|
|
|
"liblog_symbols.cpp",
|
2016-07-11 23:15:31 +02:00
|
|
|
"logging.cpp",
|
2018-10-20 01:09:39 +02:00
|
|
|
"mapped_file.cpp",
|
2019-11-14 09:48:36 +01:00
|
|
|
"parsebool.cpp",
|
2016-07-11 23:15:31 +02:00
|
|
|
"parsenetaddress.cpp",
|
2019-06-28 20:09:33 +02:00
|
|
|
"process.cpp",
|
2018-05-25 03:00:39 +02:00
|
|
|
"properties.cpp",
|
2016-07-11 23:15:31 +02:00
|
|
|
"stringprintf.cpp",
|
|
|
|
"strings.cpp",
|
2018-03-16 22:25:42 +01:00
|
|
|
"threads.cpp",
|
2016-07-11 23:15:31 +02:00
|
|
|
"test_utils.cpp",
|
|
|
|
],
|
2017-04-14 09:54:46 +02:00
|
|
|
|
2018-09-27 08:31:00 +02:00
|
|
|
cppflags: ["-Wexit-time-destructors"],
|
2016-07-11 23:15:31 +02:00
|
|
|
shared_libs: ["liblog"],
|
|
|
|
target: {
|
|
|
|
android: {
|
2017-02-15 00:46:33 +01:00
|
|
|
sanitize: {
|
|
|
|
misc_undefined: ["integer"],
|
|
|
|
},
|
2017-03-24 19:43:02 +01:00
|
|
|
|
2016-07-11 23:15:31 +02:00
|
|
|
},
|
2017-10-03 23:17:31 +02:00
|
|
|
linux: {
|
2017-03-24 19:43:02 +01:00
|
|
|
srcs: [
|
|
|
|
"errors_unix.cpp",
|
|
|
|
],
|
2016-07-11 23:15:31 +02:00
|
|
|
},
|
2017-10-03 23:17:31 +02:00
|
|
|
darwin: {
|
2017-03-24 19:43:02 +01:00
|
|
|
srcs: [
|
|
|
|
"errors_unix.cpp",
|
|
|
|
],
|
2016-11-29 22:32:55 +01:00
|
|
|
},
|
2017-10-03 23:17:31 +02:00
|
|
|
linux_bionic: {
|
|
|
|
enabled: true,
|
2016-07-11 23:15:31 +02:00
|
|
|
},
|
|
|
|
windows: {
|
|
|
|
srcs: [
|
|
|
|
"errors_windows.cpp",
|
|
|
|
"utf8.cpp",
|
|
|
|
],
|
2019-01-08 04:16:21 +01:00
|
|
|
exclude_srcs: [
|
|
|
|
"cmsg.cpp",
|
|
|
|
],
|
2016-07-11 23:15:31 +02:00
|
|
|
enabled: true,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
2018-02-15 20:40:30 +01:00
|
|
|
cc_library {
|
|
|
|
name: "libbase",
|
|
|
|
defaults: ["libbase_defaults"],
|
|
|
|
vendor_available: true,
|
2020-01-22 03:17:19 +01:00
|
|
|
ramdisk_available: true,
|
2018-05-24 07:11:00 +02:00
|
|
|
recovery_available: true,
|
2018-02-15 20:40:30 +01:00
|
|
|
host_supported: true,
|
2019-05-06 14:01:58 +02:00
|
|
|
native_bridge_supported: true,
|
2018-02-15 20:40:30 +01:00
|
|
|
vndk: {
|
|
|
|
enabled: true,
|
|
|
|
support_system_process: true,
|
|
|
|
},
|
|
|
|
header_libs: [
|
|
|
|
"libbase_headers",
|
|
|
|
],
|
|
|
|
export_header_lib_headers: ["libbase_headers"],
|
2019-06-12 09:25:04 +02:00
|
|
|
static_libs: ["fmtlib"],
|
|
|
|
whole_static_libs: ["fmtlib"],
|
|
|
|
export_static_lib_headers: ["fmtlib"],
|
2020-02-14 19:27:17 +01:00
|
|
|
apex_available: [
|
|
|
|
"//apex_available:anyapex",
|
|
|
|
"//apex_available:platform",
|
|
|
|
],
|
2020-04-16 11:48:33 +02:00
|
|
|
min_sdk_version: "29",
|
2018-02-15 20:40:30 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
cc_library_static {
|
|
|
|
name: "libbase_ndk",
|
|
|
|
defaults: ["libbase_defaults"],
|
|
|
|
sdk_version: "current",
|
|
|
|
stl: "c++_static",
|
|
|
|
export_include_dirs: ["include"],
|
2019-06-12 09:25:04 +02:00
|
|
|
static_libs: ["fmtlib_ndk"],
|
|
|
|
whole_static_libs: ["fmtlib_ndk"],
|
|
|
|
export_static_lib_headers: ["fmtlib_ndk"],
|
2018-02-15 20:40:30 +01:00
|
|
|
}
|
|
|
|
|
2016-07-11 23:15:31 +02:00
|
|
|
// Tests
|
|
|
|
// ------------------------------------------------------------------------------
|
|
|
|
cc_test {
|
|
|
|
name: "libbase_test",
|
2018-02-15 20:40:30 +01:00
|
|
|
defaults: ["libbase_cflags_defaults"],
|
2016-07-11 23:15:31 +02:00
|
|
|
host_supported: true,
|
|
|
|
srcs: [
|
2019-01-08 04:16:21 +01:00
|
|
|
"cmsg_test.cpp",
|
2017-02-24 23:02:05 +01:00
|
|
|
"endian_test.cpp",
|
2016-07-11 23:15:31 +02:00
|
|
|
"errors_test.cpp",
|
2019-05-15 12:17:48 +02:00
|
|
|
"expected_test.cpp",
|
2016-07-11 23:15:31 +02:00
|
|
|
"file_test.cpp",
|
base: reimagine line splitting in logger.cpp
Previously, we would split messages by line and call the logger
function for each line. We would hold a lock during this, to ensure
that multiple threads would not interleave their messages.
There are a few problems with this approach:
1) Using a lock is not efficient and is not fork safe
2) With APEX, there is one lock per instance of libbase, so we must
move the lock to a location where all instances can access it, or
perform the line splitting in a way that does not require the lock.
To solve these issues, we reimagine line splitting.
1) We move the lock out of the LogMessage::~LogMessage() and make it
the logger's responsibility to split lines, giving the logger the
option to lock or not.
2) We do not need any locks at all for StderrLogger.
Instead, we generate a single string that contains all of the lines
with their appropriate log header. A single write() call is used
to output this at once.
3) Logd handles log messages with newlines correctly, however it only
accepts up to a maximum size of log message. Therefore we
separate the incoming log message into chunks, delimited by new
lines, up to that maximum size, and send each of those to logd.
Note that this is the strategy used in
android.util.Log.printlns().
This should solve a majority of use cases, since the maximum size
that logd accepts is nearly 4K, while remaining lock free.
If interleaving messages absolutely must be avoided, a lock can
still be used given 1) above.
Bug: 65062446
Bug: 153824050
Test: logging, particularly multi-line stack traces, show correctly
Test: existing and new unit tests
Change-Id: Id0cb5669bee7f912da1e17f7010f0ee4c93be1e3
2020-04-17 22:05:11 +02:00
|
|
|
"logging_splitters_test.cpp",
|
2016-07-11 23:15:31 +02:00
|
|
|
"logging_test.cpp",
|
2018-04-07 02:45:22 +02:00
|
|
|
"macros_test.cpp",
|
2018-10-20 01:09:39 +02:00
|
|
|
"mapped_file_test.cpp",
|
2019-11-15 02:59:57 +01:00
|
|
|
"no_destructor_test.cpp",
|
2016-10-05 19:54:35 +02:00
|
|
|
"parsedouble_test.cpp",
|
2019-11-14 09:48:36 +01:00
|
|
|
"parsebool_test.cpp",
|
2016-07-11 23:15:31 +02:00
|
|
|
"parseint_test.cpp",
|
|
|
|
"parsenetaddress_test.cpp",
|
2019-06-28 20:09:33 +02:00
|
|
|
"process_test.cpp",
|
2018-05-25 03:00:39 +02:00
|
|
|
"properties_test.cpp",
|
2019-05-30 20:43:34 +02:00
|
|
|
"result_test.cpp",
|
2017-04-05 23:15:31 +02:00
|
|
|
"scopeguard_test.cpp",
|
2016-07-11 23:15:31 +02:00
|
|
|
"stringprintf_test.cpp",
|
|
|
|
"strings_test.cpp",
|
|
|
|
"test_main.cpp",
|
2017-04-28 04:48:44 +02:00
|
|
|
"test_utils_test.cpp",
|
2016-07-11 23:15:31 +02:00
|
|
|
],
|
|
|
|
target: {
|
2016-09-22 01:53:15 +02:00
|
|
|
android: {
|
2017-02-15 00:46:33 +01:00
|
|
|
sanitize: {
|
|
|
|
misc_undefined: ["integer"],
|
|
|
|
},
|
2016-09-22 01:53:15 +02:00
|
|
|
},
|
2017-10-03 23:17:31 +02:00
|
|
|
linux: {
|
2017-03-24 19:43:02 +01:00
|
|
|
srcs: ["chrono_utils_test.cpp"],
|
|
|
|
},
|
2016-07-11 23:15:31 +02:00
|
|
|
windows: {
|
|
|
|
srcs: ["utf8_test.cpp"],
|
2017-11-30 03:06:11 +01:00
|
|
|
cflags: ["-Wno-unused-parameter"],
|
2016-07-11 23:15:31 +02:00
|
|
|
enabled: true,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
local_include_dirs: ["."],
|
|
|
|
shared_libs: ["libbase"],
|
|
|
|
compile_multilib: "both",
|
|
|
|
multilib: {
|
|
|
|
lib32: {
|
|
|
|
suffix: "32",
|
|
|
|
},
|
|
|
|
lib64: {
|
|
|
|
suffix: "64",
|
|
|
|
},
|
|
|
|
},
|
2018-04-28 01:12:06 +02:00
|
|
|
test_suites: ["device-tests"],
|
2016-07-11 23:15:31 +02:00
|
|
|
}
|
2019-06-14 23:34:54 +02:00
|
|
|
|
2020-03-09 20:05:32 +01:00
|
|
|
cc_test {
|
|
|
|
name: "libbase_tidy_test",
|
|
|
|
defaults: ["libbase_cflags_defaults"],
|
|
|
|
host_supported: true,
|
|
|
|
|
|
|
|
tidy: true,
|
|
|
|
tidy_checks_as_errors: ["bugprone-use-after-move"],
|
|
|
|
|
|
|
|
srcs: [
|
|
|
|
"tidy/unique_fd_test.cpp",
|
|
|
|
"tidy/unique_fd_test2.cpp",
|
|
|
|
],
|
|
|
|
|
|
|
|
shared_libs: ["libbase"],
|
|
|
|
test_suites: ["device_tests"],
|
|
|
|
}
|
|
|
|
|
2019-06-14 23:34:54 +02:00
|
|
|
cc_benchmark {
|
|
|
|
name: "libbase_benchmark",
|
|
|
|
defaults: ["libbase_cflags_defaults"],
|
|
|
|
|
|
|
|
srcs: ["format_benchmark.cpp"],
|
|
|
|
shared_libs: ["libbase"],
|
|
|
|
|
|
|
|
compile_multilib: "both",
|
|
|
|
multilib: {
|
|
|
|
lib32: {
|
|
|
|
suffix: "32",
|
|
|
|
},
|
|
|
|
lib64: {
|
|
|
|
suffix: "64",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|