summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--base/Android.bp25
-rw-r--r--base/chrono_utils_test.cpp47
-rw-r--r--bootstat/Android.bp1
-rw-r--r--bootstat/boot_event_record_store.cpp10
-rw-r--r--bootstat/boot_event_record_store_test.cpp15
-rw-r--r--bootstat/bootstat.cpp16
-rw-r--r--bootstat/uptime_parser.cpp (renamed from base/include/android-base/chrono_utils.h)35
-rw-r--r--bootstat/uptime_parser.h (renamed from base/chrono_utils.cpp)21
-rw-r--r--init/Android.mk2
-rw-r--r--init/init.cpp4
-rw-r--r--init/service.cpp2
-rw-r--r--init/service.h6
-rw-r--r--init/util.cpp17
-rw-r--r--init/util.h26
14 files changed, 73 insertions, 154 deletions
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 <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
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 <fcntl.h>
#include <sys/stat.h>
#include <utime.h>
-
-#include <chrono>
#include <cstdlib>
#include <string>
#include <utility>
-
-#include <android-base/chrono_utils.h>
#include <android-base/file.h>
#include <android-base/logging.h>
#include <android-base/parseint.h>
-
#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<std::chrono::seconds>(
- 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 <sys/stat.h>
#include <sys/time.h>
#include <unistd.h>
-
-#include <chrono>
#include <cstdint>
#include <cstdlib>
-
-#include <android-base/chrono_utils.h>
#include <android-base/file.h>
#include <android-base/logging.h>
#include <android-base/test_utils.h>
#include <android-base/unique_fd.h>
#include <gtest/gtest.h>
#include <gmock/gmock.h>
+#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<std::chrono::seconds>(
- 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 <getopt.h>
#include <unistd.h>
-#include <chrono>
#include <cmath>
#include <cstddef>
#include <cstdio>
@@ -32,7 +31,6 @@
#include <vector>
#include <android/log.h>
-#include <android-base/chrono_utils.h>
#include <android-base/logging.h>
#include <android-base/parseint.h>
#include <android-base/strings.h>
@@ -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<std::chrono::seconds>(
- 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
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 <chrono>
+#include <time.h>
+#include <cstdlib>
+#include <string>
+#include <android-base/file.h>
+#include <android-base/logging.h>
-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<boot_clock, duration> 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<time_t>(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
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 <time.h>
-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 <selinux/label.h>
#include <selinux/android.h>
-#include <android-base/chrono_utils.h>
#include <android-base/file.h>
#include <android-base/stringprintf.h>
#include <android-base/strings.h>
@@ -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 <selinux/selinux.h>
-#include <android-base/chrono_utils.h>
#include <android-base/file.h>
#include <android-base/parseint.h>
#include <android-base/stringprintf.h>
@@ -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 <string>
#include <vector>
-#include <android-base/chrono_utils.h>
-
#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> double_duration;
- return std::chrono::duration_cast<double_duration>(boot_clock::now() - start_).count();
-}
-
-int64_t Timer::duration_ms() const {
- return std::chrono::duration_cast<std::chrono::milliseconds>(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 <ostream>
#include <string>
-#include <android-base/chrono_utils.h>
-
#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<boot_clock, duration> 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> double_duration;
+ return std::chrono::duration_cast<double_duration>(boot_clock::now() - start_).count();
+ }
- int64_t duration_ms() const;
+ int64_t duration_ms() const {
+ return std::chrono::duration_cast<std::chrono::milliseconds>(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);