Loading base/Android.bp +21 −4 Original line number Diff line number Diff line Loading @@ -42,21 +42,31 @@ 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: ["errors_unix.cpp"], srcs: [ "chrono_utils.cpp", "errors_unix.cpp", ], cppflags: ["-Wexit-time-destructors"], enabled: true, }, linux: { srcs: ["errors_unix.cpp"], srcs: [ "chrono_utils.cpp", "errors_unix.cpp", ], cppflags: ["-Wexit-time-destructors"], host_ldlibs: ["-lrt"], }, windows: { srcs: [ Loading Loading @@ -88,7 +98,14 @@ cc_test { ], target: { android: { srcs: ["properties_test.cpp"], srcs: [ "chrono_utils_test.cpp", "properties_test.cpp" ], }, linux: { srcs: ["chrono_utils_test.cpp"], host_ldlibs: ["-lrt"], }, windows: { srcs: ["utf8_test.cpp"], Loading bootstat/uptime_parser.h→base/chrono_utils.cpp +12 −9 Original line number Diff line number Diff line /* * Copyright (C) 2016 The Android Open Source Project * 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. Loading @@ -14,16 +14,19 @@ * limitations under the License. */ #ifndef UPTIME_PARSER_H_ #define UPTIME_PARSER_H_ #include "android-base/chrono_utils.h" #include <time.h> namespace bootstat { namespace android { namespace base { // Returns the number of seconds the system has been on since reboot. time_t ParseUptime(); 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)); } } // namespace bootstat #endif // UPTIME_PARSER_H_ No newline at end of file } // namespace base } // namespace android No newline at end of file base/chrono_utils_test.cpp 0 → 100644 +47 −0 Original line number Diff line number Diff line /* * 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 <time.h> #include <chrono> #include <gtest/gtest.h> 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<std::chrono::seconds>( 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<std::chrono::seconds>( boot_clock::now().time_since_epoch()); EXPECT_EQ(now, boot_seconds); } } // namespace base } // namespace android No newline at end of file bootstat/uptime_parser.cpp→base/include/android-base/chrono_utils.h +17 −18 Original line number Diff line number Diff line /* * Copyright (C) 2016 The Android Open Source Project * 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. Loading @@ -14,25 +14,24 @@ * limitations under the License. */ #include "uptime_parser.h" #ifndef ANDROID_BASE_CHRONO_UTILS_H #define ANDROID_BASE_CHRONO_UTILS_H #include <time.h> #include <cstdlib> #include <string> #include <android-base/file.h> #include <android-base/logging.h> #include <chrono> namespace bootstat { namespace android { namespace base { time_t ParseUptime() { std::string uptime_str; if (!android::base::ReadFileToString("/proc/uptime", &uptime_str)) { PLOG(ERROR) << "Failed to read /proc/uptime"; return -1; } // A std::chrono clock based on CLOCK_BOOTTIME. class boot_clock { public: typedef std::chrono::nanoseconds duration; typedef std::chrono::time_point<boot_clock, duration> time_point; // Cast intentionally rounds down. return static_cast<time_t>(strtod(uptime_str.c_str(), NULL)); } static time_point now(); }; } // namespace bootstat No newline at end of file } // namespace base } // namespace android #endif // ANDROID_BASE_CHRONO_UTILS_H bootstat/Android.bp +0 −1 Original line number Diff line number Diff line Loading @@ -17,7 +17,6 @@ bootstat_lib_src_files = [ "boot_event_record_store.cpp", "histogram_logger.cpp", "uptime_parser.cpp", ] cc_defaults { Loading Loading
base/Android.bp +21 −4 Original line number Diff line number Diff line Loading @@ -42,21 +42,31 @@ 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: ["errors_unix.cpp"], srcs: [ "chrono_utils.cpp", "errors_unix.cpp", ], cppflags: ["-Wexit-time-destructors"], enabled: true, }, linux: { srcs: ["errors_unix.cpp"], srcs: [ "chrono_utils.cpp", "errors_unix.cpp", ], cppflags: ["-Wexit-time-destructors"], host_ldlibs: ["-lrt"], }, windows: { srcs: [ Loading Loading @@ -88,7 +98,14 @@ cc_test { ], target: { android: { srcs: ["properties_test.cpp"], srcs: [ "chrono_utils_test.cpp", "properties_test.cpp" ], }, linux: { srcs: ["chrono_utils_test.cpp"], host_ldlibs: ["-lrt"], }, windows: { srcs: ["utf8_test.cpp"], Loading
bootstat/uptime_parser.h→base/chrono_utils.cpp +12 −9 Original line number Diff line number Diff line /* * Copyright (C) 2016 The Android Open Source Project * 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. Loading @@ -14,16 +14,19 @@ * limitations under the License. */ #ifndef UPTIME_PARSER_H_ #define UPTIME_PARSER_H_ #include "android-base/chrono_utils.h" #include <time.h> namespace bootstat { namespace android { namespace base { // Returns the number of seconds the system has been on since reboot. time_t ParseUptime(); 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)); } } // namespace bootstat #endif // UPTIME_PARSER_H_ No newline at end of file } // namespace base } // namespace android No newline at end of file
base/chrono_utils_test.cpp 0 → 100644 +47 −0 Original line number Diff line number Diff line /* * 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 <time.h> #include <chrono> #include <gtest/gtest.h> 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<std::chrono::seconds>( 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<std::chrono::seconds>( boot_clock::now().time_since_epoch()); EXPECT_EQ(now, boot_seconds); } } // namespace base } // namespace android No newline at end of file
bootstat/uptime_parser.cpp→base/include/android-base/chrono_utils.h +17 −18 Original line number Diff line number Diff line /* * Copyright (C) 2016 The Android Open Source Project * 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. Loading @@ -14,25 +14,24 @@ * limitations under the License. */ #include "uptime_parser.h" #ifndef ANDROID_BASE_CHRONO_UTILS_H #define ANDROID_BASE_CHRONO_UTILS_H #include <time.h> #include <cstdlib> #include <string> #include <android-base/file.h> #include <android-base/logging.h> #include <chrono> namespace bootstat { namespace android { namespace base { time_t ParseUptime() { std::string uptime_str; if (!android::base::ReadFileToString("/proc/uptime", &uptime_str)) { PLOG(ERROR) << "Failed to read /proc/uptime"; return -1; } // A std::chrono clock based on CLOCK_BOOTTIME. class boot_clock { public: typedef std::chrono::nanoseconds duration; typedef std::chrono::time_point<boot_clock, duration> time_point; // Cast intentionally rounds down. return static_cast<time_t>(strtod(uptime_str.c_str(), NULL)); } static time_point now(); }; } // namespace bootstat No newline at end of file } // namespace base } // namespace android #endif // ANDROID_BASE_CHRONO_UTILS_H
bootstat/Android.bp +0 −1 Original line number Diff line number Diff line Loading @@ -17,7 +17,6 @@ bootstat_lib_src_files = [ "boot_event_record_store.cpp", "histogram_logger.cpp", "uptime_parser.cpp", ] cc_defaults { Loading