summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'storaged/storaged_uid_monitor.cpp')
-rw-r--r--storaged/storaged_uid_monitor.cpp41
1 files changed, 25 insertions, 16 deletions
diff --git a/storaged/storaged_uid_monitor.cpp b/storaged/storaged_uid_monitor.cpp
index 78e0a832e..8bb6bf30b 100644
--- a/storaged/storaged_uid_monitor.cpp
+++ b/storaged/storaged_uid_monitor.cpp
@@ -20,12 +20,12 @@
20#include <time.h> 20#include <time.h>
21 21
22#include <string> 22#include <string>
23#include <sstream>
24#include <unordered_map> 23#include <unordered_map>
25 24
26#include <android-base/file.h> 25#include <android-base/file.h>
27#include <android-base/logging.h> 26#include <android-base/logging.h>
28#include <android-base/macros.h> 27#include <android-base/macros.h>
28#include <android-base/strings.h>
29#include <android-base/stringprintf.h> 29#include <android-base/stringprintf.h>
30#include <log/log_event_list.h> 30#include <log/log_event_list.h>
31#include <packagelistparser/packagelistparser.h> 31#include <packagelistparser/packagelistparser.h>
@@ -64,19 +64,33 @@ std::unordered_map<uint32_t, struct uid_info> uid_monitor::get_uid_io_stats_lock
64 return uid_io_stats; 64 return uid_io_stats;
65 } 65 }
66 66
67 std::stringstream ss(buffer); 67 std::vector<std::string> io_stats = android::base::Split(buffer, "\n");
68 struct uid_info u; 68 struct uid_info u;
69 bool refresh_uid = false; 69 bool refresh_uid = false;
70 70
71 while (ss >> u.uid) { 71 for (uint32_t i = 0; i < io_stats.size(); i++) {
72 ss >> u.io[FOREGROUND].rchar >> u.io[FOREGROUND].wchar 72 if (io_stats[i].empty()) {
73 >> u.io[FOREGROUND].read_bytes >> u.io[FOREGROUND].write_bytes 73 continue;
74 >> u.io[BACKGROUND].rchar >> u.io[BACKGROUND].wchar 74 }
75 >> u.io[BACKGROUND].read_bytes >> u.io[BACKGROUND].write_bytes; 75 std::vector<std::string> fields = android::base::Split(io_stats[i], " ");
76 76 if (fields.size() < 9) {
77 if (!ss.good()) { 77 LOG_TO(SYSTEM, WARNING) << "Invalid io stats: \""
78 ss.clear(std::ios_base::badbit); 78 << io_stats[i] << "\"";
79 break; 79 continue;
80 }
81 u.uid = stoul(fields[0]);
82 u.io[FOREGROUND].rchar = stoull(fields[1]);
83 u.io[FOREGROUND].wchar = stoull(fields[2]);
84 u.io[FOREGROUND].read_bytes = stoull(fields[3]);
85 u.io[FOREGROUND].write_bytes = stoull(fields[4]);
86 u.io[BACKGROUND].rchar = stoull(fields[5]);
87 u.io[BACKGROUND].wchar = stoull(fields[6]);
88 u.io[BACKGROUND].read_bytes = stoull(fields[7]);
89 u.io[BACKGROUND].write_bytes = stoull(fields[8]);
90
91 if (fields.size() == 11) {
92 u.io[FOREGROUND].fsync = stoull(fields[9]);
93 u.io[BACKGROUND].fsync = stoull(fields[10]);
80 } 94 }
81 95
82 if (last_uid_io_stats.find(u.uid) == last_uid_io_stats.end()) { 96 if (last_uid_io_stats.find(u.uid) == last_uid_io_stats.end()) {
@@ -88,11 +102,6 @@ std::unordered_map<uint32_t, struct uid_info> uid_monitor::get_uid_io_stats_lock
88 uid_io_stats[u.uid] = u; 102 uid_io_stats[u.uid] = u;
89 } 103 }
90 104
91 if (!ss.eof() || ss.bad()) {
92 uid_io_stats.clear();
93 LOG_TO(SYSTEM, ERROR) << "read UID IO stats failed";
94 }
95
96 if (refresh_uid) { 105 if (refresh_uid) {
97 packagelist_parse(packagelist_parse_cb, &uid_io_stats); 106 packagelist_parse(packagelist_parse_cb, &uid_io_stats);
98 } 107 }