blob: 28810d9d54d09bd92441d90b687b3cb4484ab15f [file] [log] [blame]
Mark Salyzyn34facab2014-02-06 14:48:50 -08001/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef _LOGD_LOG_STATISTICS_H__
18#define _LOGD_LOG_STATISTICS_H__
19
Mark Salyzyn720f6d12015-03-16 08:26:05 -070020#include <memory>
21#include <stdlib.h>
Mark Salyzyn34facab2014-02-06 14:48:50 -080022#include <sys/types.h>
23
Mark Salyzyn758058f2015-08-21 16:44:30 -070024#include <algorithm> // std::max
25#include <string> // std::string
Mark Salyzyn511338d2015-05-19 09:12:30 -070026#include <unordered_map>
27
Elliott Hughes4f713192015-12-04 22:00:26 -080028#include <android-base/stringprintf.h>
Mark Salyzyn34facab2014-02-06 14:48:50 -080029#include <log/log.h>
Mark Salyzyn758058f2015-08-21 16:44:30 -070030#include <private/android_filesystem_config.h>
Mark Salyzyn97c1c2b2015-03-10 13:51:35 -070031
32#include "LogBufferElement.h"
Mark Salyzyn5ac5c6b2015-08-28 08:02:59 -070033#include "LogUtils.h"
Mark Salyzyn34facab2014-02-06 14:48:50 -080034
35#define log_id_for_each(i) \
36 for (log_id_t i = LOG_ID_MIN; i < LOG_ID_MAX; i = (log_id_t) (i + 1))
37
Mark Salyzyn758058f2015-08-21 16:44:30 -070038class LogStatistics;
39
Mark Salyzyn720f6d12015-03-16 08:26:05 -070040template <typename TKey, typename TEntry>
Mark Salyzyn511338d2015-05-19 09:12:30 -070041class LogHashtable {
42
43 std::unordered_map<TKey, TEntry> map;
44
Mark Salyzyn720f6d12015-03-16 08:26:05 -070045public:
Mark Salyzyn511338d2015-05-19 09:12:30 -070046
47 typedef typename std::unordered_map<TKey, TEntry>::iterator iterator;
Mark Salyzyn758058f2015-08-21 16:44:30 -070048 typedef typename std::unordered_map<TKey, TEntry>::const_iterator const_iterator;
Mark Salyzyn511338d2015-05-19 09:12:30 -070049
Mark Salyzyn758058f2015-08-21 16:44:30 -070050 std::unique_ptr<const TEntry *[]> sort(size_t len) const {
51 if (!len) {
Mark Salyzyn720f6d12015-03-16 08:26:05 -070052 std::unique_ptr<const TEntry *[]> sorted(NULL);
53 return sorted;
54 }
55
Mark Salyzyn758058f2015-08-21 16:44:30 -070056 const TEntry **retval = new const TEntry* [len];
57 memset(retval, 0, sizeof(*retval) * len);
Mark Salyzyn720f6d12015-03-16 08:26:05 -070058
Mark Salyzyn758058f2015-08-21 16:44:30 -070059 for(const_iterator it = map.begin(); it != map.end(); ++it) {
Mark Salyzyn511338d2015-05-19 09:12:30 -070060 const TEntry &entry = it->second;
Mark Salyzyn758058f2015-08-21 16:44:30 -070061 size_t sizes = entry.getSizes();
62 ssize_t index = len - 1;
63 while ((!retval[index] || (sizes > retval[index]->getSizes()))
64 && (--index >= 0))
Mark Salyzyn720f6d12015-03-16 08:26:05 -070065 ;
Mark Salyzyn758058f2015-08-21 16:44:30 -070066 if (++index < (ssize_t)len) {
67 size_t num = len - index - 1;
68 if (num) {
69 memmove(&retval[index + 1], &retval[index],
70 num * sizeof(retval[0]));
Mark Salyzyn720f6d12015-03-16 08:26:05 -070071 }
Mark Salyzyn758058f2015-08-21 16:44:30 -070072 retval[index] = &entry;
Mark Salyzyn720f6d12015-03-16 08:26:05 -070073 }
74 }
75 std::unique_ptr<const TEntry *[]> sorted(retval);
76 return sorted;
77 }
78
Mark Salyzyn758058f2015-08-21 16:44:30 -070079 inline iterator add(TKey key, LogBufferElement *element) {
Mark Salyzyn511338d2015-05-19 09:12:30 -070080 iterator it = map.find(key);
81 if (it == map.end()) {
Mark Salyzyn758058f2015-08-21 16:44:30 -070082 it = map.insert(std::make_pair(key, TEntry(element))).first;
Mark Salyzyn511338d2015-05-19 09:12:30 -070083 } else {
Mark Salyzyn758058f2015-08-21 16:44:30 -070084 it->second.add(element);
Mark Salyzyn511338d2015-05-19 09:12:30 -070085 }
86 return it;
Mark Salyzyn720f6d12015-03-16 08:26:05 -070087 }
Mark Salyzyn81b3eab2015-04-13 14:24:45 -070088
Mark Salyzyn511338d2015-05-19 09:12:30 -070089 inline iterator add(TKey key) {
90 iterator it = map.find(key);
91 if (it == map.end()) {
92 it = map.insert(std::make_pair(key, TEntry(key))).first;
93 } else {
94 it->second.add(key);
Mark Salyzyn81b3eab2015-04-13 14:24:45 -070095 }
Mark Salyzyn511338d2015-05-19 09:12:30 -070096 return it;
Mark Salyzyn81b3eab2015-04-13 14:24:45 -070097 }
98
Mark Salyzyn758058f2015-08-21 16:44:30 -070099 void subtract(TKey key, LogBufferElement *element) {
Mark Salyzyn511338d2015-05-19 09:12:30 -0700100 iterator it = map.find(key);
Mark Salyzyn758058f2015-08-21 16:44:30 -0700101 if ((it != map.end()) && it->second.subtract(element)) {
Mark Salyzyn511338d2015-05-19 09:12:30 -0700102 map.erase(it);
Mark Salyzyn81b3eab2015-04-13 14:24:45 -0700103 }
104 }
105
Mark Salyzyn758058f2015-08-21 16:44:30 -0700106 inline void drop(TKey key, LogBufferElement *element) {
Mark Salyzyn511338d2015-05-19 09:12:30 -0700107 iterator it = map.find(key);
108 if (it != map.end()) {
Mark Salyzyn758058f2015-08-21 16:44:30 -0700109 it->second.drop(element);
Mark Salyzyn81b3eab2015-04-13 14:24:45 -0700110 }
111 }
112
Mark Salyzyn511338d2015-05-19 09:12:30 -0700113 inline iterator begin() { return map.begin(); }
Mark Salyzyn758058f2015-08-21 16:44:30 -0700114 inline const_iterator begin() const { return map.begin(); }
Mark Salyzyn511338d2015-05-19 09:12:30 -0700115 inline iterator end() { return map.end(); }
Mark Salyzyn758058f2015-08-21 16:44:30 -0700116 inline const_iterator end() const { return map.end(); }
Mark Salyzyn511338d2015-05-19 09:12:30 -0700117
Mark Salyzyn758058f2015-08-21 16:44:30 -0700118 std::string format(
119 const LogStatistics &stat,
120 uid_t uid,
121 const std::string &name = std::string(""),
122 log_id_t id = LOG_ID_MAX) const {
123 static const size_t maximum_sorted_entries = 32;
124 std::string output;
125 std::unique_ptr<const TEntry *[]> sorted = sort(maximum_sorted_entries);
126
127 if (!sorted.get()) {
128 return output;
129 }
130 bool headerPrinted = false;
131 for (size_t index = 0; index < maximum_sorted_entries; ++index) {
132 const TEntry *entry = sorted[index];
133 if (!entry) {
134 break;
135 }
136 if (entry->getSizes() <= (sorted[0]->getSizes() / 100)) {
137 break;
138 }
139 if ((uid != AID_ROOT) && (uid != entry->getUid())) {
140 continue;
141 }
142 if (!headerPrinted) {
143 output += "\n\n";
144 output += entry->formatHeader(name, id);
145 headerPrinted = true;
146 }
147 output += entry->format(stat, id);
148 }
149 return output;
150 }
Mark Salyzyn720f6d12015-03-16 08:26:05 -0700151};
152
Mark Salyzyn758058f2015-08-21 16:44:30 -0700153namespace EntryBaseConstants {
154 static constexpr size_t pruned_len = 14;
155 static constexpr size_t total_len = 80;
156}
157
Mark Salyzyn81b3eab2015-04-13 14:24:45 -0700158struct EntryBase {
Mark Salyzyn97c1c2b2015-03-10 13:51:35 -0700159 size_t size;
Mark Salyzyn81b3eab2015-04-13 14:24:45 -0700160
161 EntryBase():size(0) { }
Mark Salyzyn758058f2015-08-21 16:44:30 -0700162 EntryBase(LogBufferElement *element):size(element->getMsgLen()) { }
Mark Salyzyn81b3eab2015-04-13 14:24:45 -0700163
164 size_t getSizes() const { return size; }
165
Mark Salyzyn758058f2015-08-21 16:44:30 -0700166 inline void add(LogBufferElement *element) { size += element->getMsgLen(); }
167 inline bool subtract(LogBufferElement *element) {
168 size -= element->getMsgLen();
169 return !size;
170 }
171
172 static std::string formatLine(
173 const std::string &name,
174 const std::string &size,
175 const std::string &pruned) {
176 ssize_t drop_len = std::max(pruned.length() + 1,
177 EntryBaseConstants::pruned_len);
178 ssize_t size_len = std::max(size.length() + 1,
179 EntryBaseConstants::total_len
180 - name.length() - drop_len - 1);
181
182 if (pruned.length()) {
183 return android::base::StringPrintf("%s%*s%*s\n", name.c_str(),
184 (int)size_len, size.c_str(),
185 (int)drop_len, pruned.c_str());
186 } else {
187 return android::base::StringPrintf("%s%*s\n", name.c_str(),
188 (int)size_len, size.c_str());
189 }
190 }
Mark Salyzyn81b3eab2015-04-13 14:24:45 -0700191};
192
193struct EntryBaseDropped : public EntryBase {
Mark Salyzynab0dcf62015-03-16 12:04:09 -0700194 size_t dropped;
Mark Salyzyn34facab2014-02-06 14:48:50 -0800195
Mark Salyzyn81b3eab2015-04-13 14:24:45 -0700196 EntryBaseDropped():dropped(0) { }
Mark Salyzyn758058f2015-08-21 16:44:30 -0700197 EntryBaseDropped(LogBufferElement *element):
198 EntryBase(element),
199 dropped(element->getDropped()){
200 }
Mark Salyzyn34facab2014-02-06 14:48:50 -0800201
Mark Salyzynab0dcf62015-03-16 12:04:09 -0700202 size_t getDropped() const { return dropped; }
203
Mark Salyzyn758058f2015-08-21 16:44:30 -0700204 inline void add(LogBufferElement *element) {
205 dropped += element->getDropped();
206 EntryBase::add(element);
Mark Salyzyn81b3eab2015-04-13 14:24:45 -0700207 }
Mark Salyzyn758058f2015-08-21 16:44:30 -0700208 inline bool subtract(LogBufferElement *element) {
209 dropped -= element->getDropped();
210 return EntryBase::subtract(element) && !dropped;
Mark Salyzyn81b3eab2015-04-13 14:24:45 -0700211 }
Mark Salyzyn758058f2015-08-21 16:44:30 -0700212 inline void drop(LogBufferElement *element) {
Mark Salyzyn81b3eab2015-04-13 14:24:45 -0700213 dropped += 1;
Mark Salyzyn758058f2015-08-21 16:44:30 -0700214 EntryBase::subtract(element);
Mark Salyzyn81b3eab2015-04-13 14:24:45 -0700215 }
Mark Salyzyn34facab2014-02-06 14:48:50 -0800216};
217
Mark Salyzyn81b3eab2015-04-13 14:24:45 -0700218struct UidEntry : public EntryBaseDropped {
219 const uid_t uid;
220
Mark Salyzyn758058f2015-08-21 16:44:30 -0700221 UidEntry(LogBufferElement *element):
222 EntryBaseDropped(element),
223 uid(element->getUid()) {
224 }
Mark Salyzyn81b3eab2015-04-13 14:24:45 -0700225
226 inline const uid_t&getKey() const { return uid; }
Mark Salyzyn758058f2015-08-21 16:44:30 -0700227 inline const uid_t&getUid() const { return uid; }
228
229 std::string formatHeader(const std::string &name, log_id_t id) const;
230 std::string format(const LogStatistics &stat, log_id_t id) const;
Mark Salyzyn81b3eab2015-04-13 14:24:45 -0700231};
232
233namespace android {
Mark Salyzyn81b3eab2015-04-13 14:24:45 -0700234uid_t pidToUid(pid_t pid);
235}
236
237struct PidEntry : public EntryBaseDropped {
Mark Salyzyn720f6d12015-03-16 08:26:05 -0700238 const pid_t pid;
239 uid_t uid;
240 char *name;
Mark Salyzyn720f6d12015-03-16 08:26:05 -0700241
Mark Salyzyn758058f2015-08-21 16:44:30 -0700242 PidEntry(pid_t pid):
243 EntryBaseDropped(),
244 pid(pid),
245 uid(android::pidToUid(pid)),
246 name(android::pidToName(pid)) {
247 }
248 PidEntry(LogBufferElement *element):
249 EntryBaseDropped(element),
250 pid(element->getPid()),
251 uid(element->getUid()),
252 name(android::pidToName(pid)) {
253 }
254 PidEntry(const PidEntry &element):
255 EntryBaseDropped(element),
256 pid(element.pid),
257 uid(element.uid),
258 name(element.name ? strdup(element.name) : NULL) {
259 }
Mark Salyzyn720f6d12015-03-16 08:26:05 -0700260 ~PidEntry() { free(name); }
261
262 const pid_t&getKey() const { return pid; }
263 const uid_t&getUid() const { return uid; }
Mark Salyzyn720f6d12015-03-16 08:26:05 -0700264 const char*getName() const { return name; }
Mark Salyzyn81b3eab2015-04-13 14:24:45 -0700265
Mark Salyzyn758058f2015-08-21 16:44:30 -0700266 inline void add(pid_t newPid) {
Mark Salyzynddda2122015-10-02 09:22:52 -0700267 if (name && !fast<strncmp>(name, "zygote", 6)) {
Mark Salyzynaa43ae22015-04-20 10:27:38 -0700268 free(name);
269 name = NULL;
270 }
Mark Salyzyn81b3eab2015-04-13 14:24:45 -0700271 if (!name) {
Mark Salyzyn758058f2015-08-21 16:44:30 -0700272 name = android::pidToName(newPid);
Mark Salyzyn81b3eab2015-04-13 14:24:45 -0700273 }
274 }
275
Mark Salyzyn758058f2015-08-21 16:44:30 -0700276 inline void add(LogBufferElement *element) {
277 uid_t incomingUid = element->getUid();
278 if (getUid() != incomingUid) {
279 uid = incomingUid;
Mark Salyzyn81b3eab2015-04-13 14:24:45 -0700280 free(name);
Mark Salyzyn758058f2015-08-21 16:44:30 -0700281 name = android::pidToName(element->getPid());
Mark Salyzyn81b3eab2015-04-13 14:24:45 -0700282 } else {
Mark Salyzyn758058f2015-08-21 16:44:30 -0700283 add(element->getPid());
Mark Salyzyn81b3eab2015-04-13 14:24:45 -0700284 }
Mark Salyzyn758058f2015-08-21 16:44:30 -0700285 EntryBaseDropped::add(element);
Mark Salyzyn81b3eab2015-04-13 14:24:45 -0700286 }
Mark Salyzyn758058f2015-08-21 16:44:30 -0700287
288 std::string formatHeader(const std::string &name, log_id_t id) const;
289 std::string format(const LogStatistics &stat, log_id_t id) const;
Mark Salyzyn344bff42015-04-13 14:24:45 -0700290};
Mark Salyzyn81b3eab2015-04-13 14:24:45 -0700291
Mark Salyzyn17ed6792015-04-20 13:35:15 -0700292struct TidEntry : public EntryBaseDropped {
293 const pid_t tid;
294 uid_t uid;
295 char *name;
296
Mark Salyzyn758058f2015-08-21 16:44:30 -0700297 TidEntry(pid_t tid):
298 EntryBaseDropped(),
299 tid(tid),
300 uid(android::pidToUid(tid)),
301 name(android::tidToName(tid)) {
302 }
303 TidEntry(LogBufferElement *element):
304 EntryBaseDropped(element),
305 tid(element->getTid()),
306 uid(element->getUid()),
307 name(android::tidToName(tid)) {
308 }
309 TidEntry(const TidEntry &element):
310 EntryBaseDropped(element),
311 tid(element.tid),
312 uid(element.uid),
313 name(element.name ? strdup(element.name) : NULL) {
314 }
Mark Salyzyn17ed6792015-04-20 13:35:15 -0700315 ~TidEntry() { free(name); }
316
317 const pid_t&getKey() const { return tid; }
318 const uid_t&getUid() const { return uid; }
319 const char*getName() const { return name; }
320
Mark Salyzyn758058f2015-08-21 16:44:30 -0700321 inline void add(pid_t incomingTid) {
Mark Salyzynddda2122015-10-02 09:22:52 -0700322 if (name && !fast<strncmp>(name, "zygote", 6)) {
Mark Salyzyn17ed6792015-04-20 13:35:15 -0700323 free(name);
324 name = NULL;
325 }
326 if (!name) {
Mark Salyzyn758058f2015-08-21 16:44:30 -0700327 name = android::tidToName(incomingTid);
Mark Salyzyn17ed6792015-04-20 13:35:15 -0700328 }
329 }
330
Mark Salyzyn758058f2015-08-21 16:44:30 -0700331 inline void add(LogBufferElement *element) {
332 uid_t incomingUid = element->getUid();
333 if (getUid() != incomingUid) {
334 uid = incomingUid;
Mark Salyzyn17ed6792015-04-20 13:35:15 -0700335 free(name);
Mark Salyzyn758058f2015-08-21 16:44:30 -0700336 name = android::tidToName(element->getTid());
Mark Salyzyn17ed6792015-04-20 13:35:15 -0700337 } else {
Mark Salyzyn758058f2015-08-21 16:44:30 -0700338 add(element->getTid());
Mark Salyzyn17ed6792015-04-20 13:35:15 -0700339 }
Mark Salyzyn758058f2015-08-21 16:44:30 -0700340 EntryBaseDropped::add(element);
Mark Salyzyn17ed6792015-04-20 13:35:15 -0700341 }
Mark Salyzyn758058f2015-08-21 16:44:30 -0700342
343 std::string formatHeader(const std::string &name, log_id_t id) const;
344 std::string format(const LogStatistics &stat, log_id_t id) const;
Mark Salyzyn17ed6792015-04-20 13:35:15 -0700345};
346
Mark Salyzyn344bff42015-04-13 14:24:45 -0700347struct TagEntry : public EntryBase {
348 const uint32_t tag;
349 uid_t uid;
350
Mark Salyzyn758058f2015-08-21 16:44:30 -0700351 TagEntry(LogBufferElement *element):
352 EntryBase(element),
353 tag(element->getTag()),
354 uid(element->getUid()) {
355 }
Mark Salyzyn344bff42015-04-13 14:24:45 -0700356
357 const uint32_t&getKey() const { return tag; }
358 const uid_t&getUid() const { return uid; }
359 const char*getName() const { return android::tagToName(tag); }
360
Mark Salyzyn758058f2015-08-21 16:44:30 -0700361 inline void add(LogBufferElement *element) {
362 uid_t incomingUid = element->getUid();
363 if (uid != incomingUid) {
Mark Salyzyn344bff42015-04-13 14:24:45 -0700364 uid = -1;
365 }
Mark Salyzyn758058f2015-08-21 16:44:30 -0700366 EntryBase::add(element);
Mark Salyzyn344bff42015-04-13 14:24:45 -0700367 }
Mark Salyzyn758058f2015-08-21 16:44:30 -0700368
369 std::string formatHeader(const std::string &name, log_id_t id) const;
370 std::string format(const LogStatistics &stat, log_id_t id) const;
Mark Salyzyn720f6d12015-03-16 08:26:05 -0700371};
372
Mark Salyzyn34facab2014-02-06 14:48:50 -0800373// Log Statistics
374class LogStatistics {
Mark Salyzync723df82015-08-24 11:08:00 -0700375 friend UidEntry;
376
Mark Salyzyn34facab2014-02-06 14:48:50 -0800377 size_t mSizes[LOG_ID_MAX];
378 size_t mElements[LOG_ID_MAX];
Mark Salyzyn58b8be82015-09-30 07:40:09 -0700379 size_t mDroppedElements[LOG_ID_MAX];
Mark Salyzyn97c1c2b2015-03-10 13:51:35 -0700380 size_t mSizesTotal[LOG_ID_MAX];
381 size_t mElementsTotal[LOG_ID_MAX];
Mark Salyzyn720f6d12015-03-16 08:26:05 -0700382 bool enable;
Mark Salyzyn34facab2014-02-06 14:48:50 -0800383
Mark Salyzyn97c1c2b2015-03-10 13:51:35 -0700384 // uid to size list
Mark Salyzyn720f6d12015-03-16 08:26:05 -0700385 typedef LogHashtable<uid_t, UidEntry> uidTable_t;
Mark Salyzyn97c1c2b2015-03-10 13:51:35 -0700386 uidTable_t uidTable[LOG_ID_MAX];
Mark Salyzyne457b742014-02-19 17:18:31 -0800387
Mark Salyzyn720f6d12015-03-16 08:26:05 -0700388 // pid to uid list
389 typedef LogHashtable<pid_t, PidEntry> pidTable_t;
390 pidTable_t pidTable;
391
Mark Salyzyn17ed6792015-04-20 13:35:15 -0700392 // tid to uid list
393 typedef LogHashtable<pid_t, TidEntry> tidTable_t;
394 tidTable_t tidTable;
395
Mark Salyzyn344bff42015-04-13 14:24:45 -0700396 // tag list
397 typedef LogHashtable<uint32_t, TagEntry> tagTable_t;
398 tagTable_t tagTable;
399
Mark Salyzyn34facab2014-02-06 14:48:50 -0800400public:
Mark Salyzyn34facab2014-02-06 14:48:50 -0800401 LogStatistics();
402
Mark Salyzyn720f6d12015-03-16 08:26:05 -0700403 void enableStatistics() { enable = true; }
Mark Salyzyn34facab2014-02-06 14:48:50 -0800404
Mark Salyzyn97c1c2b2015-03-10 13:51:35 -0700405 void add(LogBufferElement *entry);
406 void subtract(LogBufferElement *entry);
Mark Salyzynab0dcf62015-03-16 12:04:09 -0700407 // entry->setDropped(1) must follow this call
408 void drop(LogBufferElement *entry);
Mark Salyzynaaad42f2015-09-30 07:40:09 -0700409 // Correct for coalescing two entries referencing dropped content
Mark Salyzyn58b8be82015-09-30 07:40:09 -0700410 void erase(LogBufferElement *element) {
411 log_id_t log_id = element->getLogId();
412 --mElements[log_id];
413 --mDroppedElements[log_id];
414 }
Mark Salyzyne457b742014-02-19 17:18:31 -0800415
Mark Salyzyn758058f2015-08-21 16:44:30 -0700416 std::unique_ptr<const UidEntry *[]> sort(size_t len, log_id id) {
417 return uidTable[id].sort(len);
418 }
Mark Salyzyn34facab2014-02-06 14:48:50 -0800419
420 // fast track current value by id only
421 size_t sizes(log_id_t id) const { return mSizes[id]; }
422 size_t elements(log_id_t id) const { return mElements[id]; }
Mark Salyzyn58b8be82015-09-30 07:40:09 -0700423 size_t realElements(log_id_t id) const {
424 return mElements[id] - mDroppedElements[id];
425 }
Mark Salyzyn97c1c2b2015-03-10 13:51:35 -0700426 size_t sizesTotal(log_id_t id) const { return mSizesTotal[id]; }
427 size_t elementsTotal(log_id_t id) const { return mElementsTotal[id]; }
Mark Salyzyn34facab2014-02-06 14:48:50 -0800428
Mark Salyzyn758058f2015-08-21 16:44:30 -0700429 std::string format(uid_t uid, unsigned int logMask) const;
Mark Salyzyn9a038632014-04-07 07:05:40 -0700430
Mark Salyzyned777e92015-06-24 16:22:54 -0700431 // helper (must be locked directly or implicitly by mLogElementsLock)
Mark Salyzyn758058f2015-08-21 16:44:30 -0700432 const char *pidToName(pid_t pid) const;
Mark Salyzyn4ba03872014-04-07 07:15:33 -0700433 uid_t pidToUid(pid_t pid);
Mark Salyzyn758058f2015-08-21 16:44:30 -0700434 const char *uidToName(uid_t uid) const;
Mark Salyzyn34facab2014-02-06 14:48:50 -0800435};
436
437#endif // _LOGD_LOG_STATISTICS_H__