am 1ab0cf4d: Merge "logd: Statistics improvements"

* commit '1ab0cf4d34ea8c4a8064b53634034293940f78f0':
  logd: Statistics improvements
This commit is contained in:
Mark Salyzyn 2014-04-25 20:42:14 +00:00 committed by Android Git Automerger
commit c3aff21a66
3 changed files with 108 additions and 38 deletions

View File

@ -167,17 +167,14 @@ void LogBuffer::prune(log_id_t id, unsigned long pruneRows) {
if ((id != LOG_ID_CRASH) && mPrune.worstUidEnabled()) {
LidStatistics &l = stats.id(id);
UidStatisticsCollection::iterator iu;
for (iu = l.begin(); iu != l.end(); ++iu) {
UidStatistics *u = (*iu);
size_t sizes = u->sizes();
if (worst_sizes < sizes) {
second_worst_sizes = worst_sizes;
worst_sizes = sizes;
worst = u->getUid();
}
if ((second_worst_sizes < sizes) && (sizes < worst_sizes)) {
second_worst_sizes = sizes;
l.sort();
UidStatisticsCollection::iterator iu = l.begin();
if (iu != l.end()) {
UidStatistics *u = *iu;
worst = u->getUid();
worst_sizes = u->sizes();
if (++iu != l.end()) {
second_worst_sizes = (*iu)->sizes();
}
}
}

View File

@ -96,7 +96,9 @@ char *PidStatistics::pidToName(pid_t pid) {
}
UidStatistics::UidStatistics(uid_t uid)
: uid(uid) {
: uid(uid)
, mSizes(0)
, mElements(0) {
Pids.clear();
}
@ -109,6 +111,9 @@ UidStatistics::~UidStatistics() {
}
void UidStatistics::add(unsigned short size, pid_t pid) {
mSizes += size;
++mElements;
PidStatistics *p;
PidStatisticsCollection::iterator last;
PidStatisticsCollection::iterator it;
@ -116,18 +121,11 @@ void UidStatistics::add(unsigned short size, pid_t pid) {
p = *it;
if (pid == p->getPid()) {
p->add(size);
// poor-man sort, bubble upwards if bigger than last
if ((last != it) && ((*last)->sizesTotal() < p->sizesTotal())) {
Pids.erase(it);
Pids.insert(last, p);
}
return;
}
}
// poor-man sort, insert if bigger than last or last is the gone entry.
bool insert = (last != it)
&& ((p->getPid() == p->gone)
|| ((*last)->sizesTotal() < (size_t) size));
// insert if the gone entry.
bool insert = (last != it) && (p->getPid() == p->gone);
p = new PidStatistics(pid, pidToName(pid));
if (insert) {
Pids.insert(last, p);
@ -138,6 +136,9 @@ void UidStatistics::add(unsigned short size, pid_t pid) {
}
void UidStatistics::subtract(unsigned short size, pid_t pid) {
mSizes -= size;
--mElements;
PidStatisticsCollection::iterator it;
for (it = begin(); it != end(); ++it) {
PidStatistics *p = *it;
@ -166,28 +167,57 @@ void UidStatistics::subtract(unsigned short size, pid_t pid) {
}
}
void UidStatistics::sort() {
for (bool pass = true; pass;) {
pass = false;
PidStatisticsCollection::iterator it = begin();
if (it != end()) {
PidStatisticsCollection::iterator lt = it;
PidStatistics *l = (*lt);
while (++it != end()) {
PidStatistics *n = (*it);
if ((n->getPid() != n->gone) && (n->sizes() > l->sizes())) {
pass = true;
Pids.erase(it);
Pids.insert(lt, n);
it = lt;
n = l;
}
lt = it;
l = n;
}
}
}
}
size_t UidStatistics::sizes(pid_t pid) {
size_t sizes = 0;
if (pid == pid_all) {
return sizes();
}
PidStatisticsCollection::iterator it;
for (it = begin(); it != end(); ++it) {
PidStatistics *p = *it;
if ((pid == pid_all) || (pid == p->getPid())) {
sizes += p->sizes();
if (pid == p->getPid()) {
return p->sizes();
}
}
return sizes;
return 0;
}
size_t UidStatistics::elements(pid_t pid) {
size_t elements = 0;
if (pid == pid_all) {
return elements();
}
PidStatisticsCollection::iterator it;
for (it = begin(); it != end(); ++it) {
PidStatistics *p = *it;
if ((pid == pid_all) || (pid == p->getPid())) {
elements += p->elements();
if (pid == p->getPid()) {
return p->elements();
}
}
return elements;
return 0;
}
size_t UidStatistics::sizesTotal(pid_t pid) {
@ -266,6 +296,29 @@ void LidStatistics::subtract(unsigned short size, uid_t uid, pid_t pid) {
}
}
void LidStatistics::sort() {
for (bool pass = true; pass;) {
pass = false;
UidStatisticsCollection::iterator it = begin();
if (it != end()) {
UidStatisticsCollection::iterator lt = it;
UidStatistics *l = (*lt);
while (++it != end()) {
UidStatistics *n = (*it);
if (n->sizes() > l->sizes()) {
pass = true;
Uids.erase(it);
Uids.insert(lt, n);
it = lt;
n = l;
}
lt = it;
l = n;
}
}
}
}
size_t LidStatistics::sizes(uid_t uid, pid_t pid) {
size_t sizes = 0;
UidStatisticsCollection::iterator it;
@ -455,13 +508,22 @@ void LogStatistics::format(char **buf,
short spaces = 2;
log_id_for_each(i) {
if (logMask & (1 << i)) {
oldLength = string.length();
if (spaces < 0) {
spaces = 0;
}
string.appendFormat("%*s%s", spaces, "", android_log_id_to_name(i));
spaces += spaces_total + oldLength - string.length();
if (!logMask & (1 << i)) {
continue;
}
oldLength = string.length();
if (spaces < 0) {
spaces = 0;
}
string.appendFormat("%*s%s", spaces, "", android_log_id_to_name(i));
spaces += spaces_total + oldLength - string.length();
LidStatistics &l = id(i);
l.sort();
UidStatisticsCollection::iterator iu;
for (iu = l.begin(); iu != l.end(); ++iu) {
(*iu)->sort();
}
}

View File

@ -70,6 +70,9 @@ class UidStatistics {
PidStatisticsCollection Pids;
size_t mSizes;
size_t mElements;
public:
UidStatistics(uid_t uid);
~UidStatistics();
@ -81,11 +84,17 @@ public:
void add(unsigned short size, pid_t pid);
void subtract(unsigned short size, pid_t pid);
void sort();
static const pid_t pid_all = (pid_t) -1;
size_t sizes(pid_t pid = pid_all);
size_t elements(pid_t pid = pid_all);
// fast track current value
size_t sizes() const { return mSizes; };
size_t elements() const { return mElements; };
// statistical track
size_t sizes(pid_t pid);
size_t elements(pid_t pid);
size_t sizesTotal(pid_t pid = pid_all);
size_t elementsTotal(pid_t pid = pid_all);
@ -108,6 +117,7 @@ public:
void add(unsigned short size, uid_t uid, pid_t pid);
void subtract(unsigned short size, uid_t uid, pid_t pid);
void sort();
static const pid_t pid_all = (pid_t) -1;
static const uid_t uid_all = (uid_t) -1;
@ -145,6 +155,7 @@ public:
void add(unsigned short size, log_id_t log_id, uid_t uid, pid_t pid);
void subtract(unsigned short size, log_id_t log_id, uid_t uid, pid_t pid);
void sort();
// fast track current value by id only
size_t sizes(log_id_t id) const { return mSizes[id]; }