OSDN Git Service

Record device screen state and system load (from /proc/loadavg).
authorThan McIntosh <thanm@google.com>
Wed, 10 Jun 2015 15:47:01 +0000 (11:47 -0400)
committerThan McIntosh <thanm@google.com>
Thu, 11 Jun 2015 17:46:33 +0000 (13:46 -0400)
Bug: http://b/19483574

(cherry picked from commit ebb946827ffbbb7df4c41be262a627c02bd95888)

Change-Id: I2a00e1fb075131e7d7d1a45c196ab0ac414e39c0

perfprofd/perf_profile.proto
perfprofd/perfprofdcore.cc

index ee34163..3932a16 100644 (file)
@@ -91,4 +91,12 @@ message AndroidPerfProfile {
 
   // List of all load modules.
   repeated LoadModule load_modules = 4;
-}
\ No newline at end of file
+
+  // is device screen on at point when profile is collected?
+  optional bool display_on = 5;
+
+  // system load at point when profile is collected; corresponds
+  // to first value from /proc/loadavg multiplied by 100 then
+  // converted to int32
+  optional int32 sys_load_average = 6;
+}
index 1cf08ad..8f5b013 100644 (file)
@@ -34,6 +34,7 @@
 #include <set>
 #include <cctype>
 
+#include <base/file.h>
 #include <base/stringprintf.h>
 #include <cutils/properties.h>
 
@@ -481,6 +482,35 @@ static CKPROFILE_RESULT check_profiling_enabled(ConfigReader &config)
   return DO_COLLECT_PROFILE;
 }
 
+static void annotate_encoded_perf_profile(wireless_android_play_playlog::AndroidPerfProfile *profile)
+{
+  //
+  // Load average as reported by the kernel
+  //
+  std::string load;
+  double fload = 0.0;
+  if (android::base::ReadFileToString("/proc/loadavg", &load) &&
+      sscanf(load.c_str(), "%lf", &fload) == 1) {
+    int iload = static_cast<int>(fload * 100.0);
+    profile->set_sys_load_average(iload);
+  } else {
+    W_ALOGE("Failed to read or scan /proc/loadavg (%s)", strerror(errno));
+  }
+
+  //
+  // Examine the contents of wake_unlock to determine whether the
+  // device display is on or off. NB: is this really the only way to
+  // determine this info?
+  //
+  std::string disp;
+  if (android::base::ReadFileToString("/sys/power/wake_unlock", &disp)) {
+    bool ison = (strstr(disp.c_str(), "PowerManagerService.Display") == 0);
+    profile->set_display_on(ison);
+  } else {
+    W_ALOGE("Failed to read /sys/power/wake_unlock (%s)", strerror(errno));
+  }
+}
+
 inline char* string_as_array(std::string* str) {
   return str->empty() ? NULL : &*str->begin();
 }
@@ -501,6 +531,13 @@ PROFILE_RESULT encode_to_proto(const std::string &data_file_path,
     return ERR_PERF_ENCODE_FAILED;
   }
 
+  // All of the info in 'encodedProfile' is derived from the perf.data file;
+  // here we tack display status and system load.
+  wireless_android_play_playlog::AndroidPerfProfile &prof =
+      const_cast<wireless_android_play_playlog::AndroidPerfProfile&>
+      (encodedProfile);
+  annotate_encoded_perf_profile(&prof);
+
   //
   // Serialize protobuf to array
   //