diff options
Diffstat (limited to 'storaged/storaged_uid_monitor.cpp')
-rw-r--r-- | storaged/storaged_uid_monitor.cpp | 41 |
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 | } |