diff --git a/base/Android.bp b/base/Android.bp index 515b063f9..b9a6e0bd6 100644 --- a/base/Android.bp +++ b/base/Android.bp @@ -42,31 +42,21 @@ cc_library { srcs: [ "errors_unix.cpp", "properties.cpp", - "chrono_utils.cpp", ], cppflags: ["-Wexit-time-destructors"], }, darwin: { - srcs: [ - "errors_unix.cpp", - ], + srcs: ["errors_unix.cpp"], cppflags: ["-Wexit-time-destructors"], }, linux_bionic: { - srcs: [ - "chrono_utils.cpp", - "errors_unix.cpp", - ], + srcs: ["errors_unix.cpp"], cppflags: ["-Wexit-time-destructors"], enabled: true, }, linux: { - srcs: [ - "chrono_utils.cpp", - "errors_unix.cpp", - ], + srcs: ["errors_unix.cpp"], cppflags: ["-Wexit-time-destructors"], - host_ldlibs: ["-lrt"], }, windows: { srcs: [ @@ -98,14 +88,7 @@ cc_test { ], target: { android: { - srcs: [ - "chrono_utils_test.cpp", - "properties_test.cpp" - ], - }, - linux: { - srcs: ["chrono_utils_test.cpp"], - host_ldlibs: ["-lrt"], + srcs: ["properties_test.cpp"], }, windows: { srcs: ["utf8_test.cpp"], diff --git a/base/chrono_utils_test.cpp b/base/chrono_utils_test.cpp deleted file mode 100644 index bc6df4b9a..000000000 --- a/base/chrono_utils_test.cpp +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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 "android-base/chrono_utils.h" - -#include - -#include - -#include - -namespace android { -namespace base { - -std::chrono::seconds GetBootTimeSeconds() { - struct timespec now; - clock_gettime(CLOCK_BOOTTIME, &now); - - auto now_tp = boot_clock::time_point( - std::chrono::seconds(now.tv_sec) + std::chrono::nanoseconds(now.tv_nsec)); - return std::chrono::duration_cast( - now_tp.time_since_epoch()); -} - -// Tests (at least) the seconds accuracy of the boot_clock::now() method. -TEST(ChronoUtilsTest, BootClockNowSeconds) { - auto now = GetBootTimeSeconds(); - auto boot_seconds = std::chrono::duration_cast( - boot_clock::now().time_since_epoch()); - EXPECT_EQ(now, boot_seconds); -} - -} // namespace base -} // namespace android \ No newline at end of file diff --git a/bootstat/Android.bp b/bootstat/Android.bp index 7d9d7a27a..d98a9d7dd 100644 --- a/bootstat/Android.bp +++ b/bootstat/Android.bp @@ -17,6 +17,7 @@ bootstat_lib_src_files = [ "boot_event_record_store.cpp", "histogram_logger.cpp", + "uptime_parser.cpp", ] cc_defaults { diff --git a/bootstat/boot_event_record_store.cpp b/bootstat/boot_event_record_store.cpp index 8babf1a9e..f902af337 100644 --- a/bootstat/boot_event_record_store.cpp +++ b/bootstat/boot_event_record_store.cpp @@ -20,18 +20,14 @@ #include #include #include - -#include #include #include #include - -#include #include #include #include - #include "histogram_logger.h" +#include "uptime_parser.h" namespace { @@ -60,9 +56,7 @@ BootEventRecordStore::BootEventRecordStore() { } void BootEventRecordStore::AddBootEvent(const std::string& event) { - auto uptime = std::chrono::duration_cast( - android::base::boot_clock::now().time_since_epoch()); - AddBootEventWithValue(event, uptime.count()); + AddBootEventWithValue(event, bootstat::ParseUptime()); } // The implementation of AddBootEventValue makes use of the mtime file diff --git a/bootstat/boot_event_record_store_test.cpp b/bootstat/boot_event_record_store_test.cpp index 0df67061f..90f6513e4 100644 --- a/bootstat/boot_event_record_store_test.cpp +++ b/bootstat/boot_event_record_store_test.cpp @@ -21,18 +21,15 @@ #include #include #include - -#include #include #include - -#include #include #include #include #include #include #include +#include "uptime_parser.h" using testing::UnorderedElementsAreArray; @@ -92,12 +89,6 @@ void DeleteDirectory(const std::string& path) { rmdir(path.c_str()); } -// Returns the time in seconds since boot. -time_t GetUptimeSeconds() { - return std::chrono::duration_cast( - android::base::boot_clock::now().time_since_epoch()).count(); -} - class BootEventRecordStoreTest : public ::testing::Test { public: BootEventRecordStoreTest() { @@ -135,7 +126,7 @@ TEST_F(BootEventRecordStoreTest, AddSingleBootEvent) { BootEventRecordStore store; store.SetStorePath(GetStorePathForTesting()); - time_t uptime = GetUptimeSeconds(); + time_t uptime = bootstat::ParseUptime(); ASSERT_NE(-1, uptime); store.AddBootEvent("cenozoic"); @@ -150,7 +141,7 @@ TEST_F(BootEventRecordStoreTest, AddMultipleBootEvents) { BootEventRecordStore store; store.SetStorePath(GetStorePathForTesting()); - time_t uptime = GetUptimeSeconds(); + time_t uptime = bootstat::ParseUptime(); ASSERT_NE(-1, uptime); store.AddBootEvent("cretaceous"); diff --git a/bootstat/bootstat.cpp b/bootstat/bootstat.cpp index 322add327..c85667e86 100644 --- a/bootstat/bootstat.cpp +++ b/bootstat/bootstat.cpp @@ -21,7 +21,6 @@ #include #include -#include #include #include #include @@ -32,7 +31,6 @@ #include #include -#include #include #include #include @@ -40,6 +38,7 @@ #include "boot_event_record_store.h" #include "histogram_logger.h" +#include "uptime_parser.h" namespace { @@ -248,8 +247,7 @@ void RecordBootComplete() { BootEventRecordStore boot_event_store; BootEventRecordStore::BootEventRecord record; - auto uptime = std::chrono::duration_cast( - android::base::boot_clock::now().time_since_epoch()); + time_t uptime = bootstat::ParseUptime(); time_t current_time_utc = time(nullptr); if (boot_event_store.GetBootEvent("last_boot_time_utc", &record)) { @@ -276,22 +274,22 @@ void RecordBootComplete() { // Log the amount of time elapsed until the device is decrypted, which // includes the variable amount of time the user takes to enter the // decryption password. - boot_event_store.AddBootEventWithValue("boot_decryption_complete", uptime.count()); + boot_event_store.AddBootEventWithValue("boot_decryption_complete", uptime); // Subtract the decryption time to normalize the boot cycle timing. - std::chrono::seconds boot_complete = std::chrono::seconds(uptime.count() - record.second); + time_t boot_complete = uptime - record.second; boot_event_store.AddBootEventWithValue(boot_complete_prefix + "_post_decrypt", - boot_complete.count()); + boot_complete); } else { boot_event_store.AddBootEventWithValue(boot_complete_prefix + "_no_encryption", - uptime.count()); + uptime); } // Record the total time from device startup to boot complete, regardless of // encryption state. - boot_event_store.AddBootEventWithValue(boot_complete_prefix, uptime.count()); + boot_event_store.AddBootEventWithValue(boot_complete_prefix, uptime); RecordInitBootTimeProp(&boot_event_store, "ro.boottime.init"); RecordInitBootTimeProp(&boot_event_store, "ro.boottime.init.selinux"); diff --git a/base/include/android-base/chrono_utils.h b/bootstat/uptime_parser.cpp similarity index 51% rename from base/include/android-base/chrono_utils.h rename to bootstat/uptime_parser.cpp index 0086425e5..7c2034c3d 100644 --- a/base/include/android-base/chrono_utils.h +++ b/bootstat/uptime_parser.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017 The Android Open Source Project + * 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. @@ -14,24 +14,25 @@ * limitations under the License. */ -#ifndef ANDROID_BASE_CHRONO_UTILS_H -#define ANDROID_BASE_CHRONO_UTILS_H +#include "uptime_parser.h" -#include +#include +#include +#include +#include +#include -namespace android { -namespace base { +namespace bootstat { -// A std::chrono clock based on CLOCK_BOOTTIME. -class boot_clock { - public: - typedef std::chrono::nanoseconds duration; - typedef std::chrono::time_point time_point; +time_t ParseUptime() { + std::string uptime_str; + if (!android::base::ReadFileToString("/proc/uptime", &uptime_str)) { + PLOG(ERROR) << "Failed to read /proc/uptime"; + return -1; + } - static time_point now(); -}; + // Cast intentionally rounds down. + return static_cast(strtod(uptime_str.c_str(), NULL)); +} -} // namespace base -} // namespace android - -#endif // ANDROID_BASE_CHRONO_UTILS_H +} // namespace bootstat \ No newline at end of file diff --git a/base/chrono_utils.cpp b/bootstat/uptime_parser.h similarity index 59% rename from base/chrono_utils.cpp rename to bootstat/uptime_parser.h index d1c69c5cc..756ae9b7c 100644 --- a/base/chrono_utils.cpp +++ b/bootstat/uptime_parser.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017 The Android Open Source Project + * 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. @@ -14,19 +14,16 @@ * limitations under the License. */ -#include "android-base/chrono_utils.h" +#ifndef UPTIME_PARSER_H_ +#define UPTIME_PARSER_H_ #include -namespace android { -namespace base { +namespace bootstat { -boot_clock::time_point boot_clock::now() { - timespec ts; - clock_gettime(CLOCK_BOOTTIME, &ts); - return boot_clock::time_point(std::chrono::seconds(ts.tv_sec) + - std::chrono::nanoseconds(ts.tv_nsec)); -} +// Returns the number of seconds the system has been on since reboot. +time_t ParseUptime(); -} // namespace base -} // namespace android \ No newline at end of file +} // namespace bootstat + +#endif // UPTIME_PARSER_H_ \ No newline at end of file diff --git a/init/Android.mk b/init/Android.mk index 53ef2d07c..9e61fb2f6 100644 --- a/init/Android.mk +++ b/init/Android.mk @@ -36,7 +36,7 @@ LOCAL_MODULE := init_parser_tests LOCAL_SRC_FILES := \ parser/tokenizer_test.cpp \ -LOCAL_STATIC_LIBRARIES := libbase libinit_parser +LOCAL_STATIC_LIBRARIES := libinit_parser LOCAL_CLANG := true include $(BUILD_HOST_NATIVE_TEST) endif diff --git a/init/init.cpp b/init/init.cpp index 4af0656c0..43f601f69 100644 --- a/init/init.cpp +++ b/init/init.cpp @@ -40,7 +40,6 @@ #include #include -#include #include #include #include @@ -69,7 +68,6 @@ #include "util.h" #include "watchdogd.h" -using android::base::boot_clock; using android::base::StringPrintf; struct selabel_handle *sehandle; @@ -752,7 +750,7 @@ int main(int argc, char** argv) { return watchdogd_main(argc, argv); } - boot_clock::time_point start_time = android::base::boot_clock::now(); + boot_clock::time_point start_time = boot_clock::now(); // Clear the umask. umask(0); diff --git a/init/service.cpp b/init/service.cpp index cbdc4a8f8..e186f27a8 100644 --- a/init/service.cpp +++ b/init/service.cpp @@ -32,7 +32,6 @@ #include -#include #include #include #include @@ -48,7 +47,6 @@ #include "property_service.h" #include "util.h" -using android::base::boot_clock; using android::base::ParseInt; using android::base::StringPrintf; using android::base::WriteStringToFile; diff --git a/init/service.h b/init/service.h index 3dc0e53a2..013e65f04 100644 --- a/init/service.h +++ b/init/service.h @@ -25,8 +25,6 @@ #include #include -#include - #include "action.h" #include "capabilities.h" #include "descriptors.h" @@ -137,8 +135,8 @@ private: unsigned flags_; pid_t pid_; - android::base::boot_clock::time_point time_started_; // time of last start - android::base::boot_clock::time_point time_crashed_; // first crash within inspection window + boot_clock::time_point time_started_; // time of last start + boot_clock::time_point time_crashed_; // first crash within inspection window int crash_count_; // number of times crashed within window uid_t uid_; diff --git a/init/util.cpp b/init/util.cpp index f59ba82e1..888a36652 100644 --- a/init/util.cpp +++ b/init/util.cpp @@ -51,8 +51,6 @@ #include "property_service.h" #include "util.h" -using android::base::boot_clock; - static unsigned int do_decode_uid(const char *s) { unsigned int v; @@ -201,16 +199,11 @@ bool write_file(const char* path, const char* content) { return success; } -Timer::Timer() : start_(boot_clock::now()) { -} - -double Timer::duration_s() const { - typedef std::chrono::duration double_duration; - return std::chrono::duration_cast(boot_clock::now() - start_).count(); -} - -int64_t Timer::duration_ms() const { - return std::chrono::duration_cast(boot_clock::now() - start_).count(); +boot_clock::time_point boot_clock::now() { + timespec ts; + clock_gettime(CLOCK_BOOTTIME, &ts); + return boot_clock::time_point(std::chrono::seconds(ts.tv_sec) + + std::chrono::nanoseconds(ts.tv_nsec)); } int mkdir_recursive(const char *pathname, mode_t mode) diff --git a/init/util.h b/init/util.h index 4444427ea..5c38dc3c9 100644 --- a/init/util.h +++ b/init/util.h @@ -25,8 +25,6 @@ #include #include -#include - #define COLDBOOT_DONE "/dev/.coldboot_done" using namespace std::chrono_literals; @@ -37,16 +35,32 @@ int create_socket(const char *name, int type, mode_t perm, bool read_file(const char* path, std::string* content); bool write_file(const char* path, const char* content); +// A std::chrono clock based on CLOCK_BOOTTIME. +class boot_clock { + public: + typedef std::chrono::nanoseconds duration; + typedef std::chrono::time_point time_point; + static constexpr bool is_steady = true; + + static time_point now(); +}; + class Timer { public: - Timer(); + Timer() : start_(boot_clock::now()) { + } - double duration_s() const; + double duration_s() const { + typedef std::chrono::duration double_duration; + return std::chrono::duration_cast(boot_clock::now() - start_).count(); + } - int64_t duration_ms() const; + int64_t duration_ms() const { + return std::chrono::duration_cast(boot_clock::now() - start_).count(); + } private: - android::base::boot_clock::time_point start_; + boot_clock::time_point start_; }; std::ostream& operator<<(std::ostream& os, const Timer& t);