LogStatistics.cpp revision 34facab86b0fe7ec613de92b46b637f864fb0682
134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn/*
234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * Copyright (C) 2014 The Android Open Source Project
334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn *
434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * Licensed under the Apache License, Version 2.0 (the "License");
534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * you may not use this file except in compliance with the License.
634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * You may obtain a copy of the License at
734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn *
834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn *      http://www.apache.org/licenses/LICENSE-2.0
934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn *
1034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * Unless required by applicable law or agreed to in writing, software
1134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * distributed under the License is distributed on an "AS IS" BASIS,
1234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * See the License for the specific language governing permissions and
1434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * limitations under the License.
1534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn */
1634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
1734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#include <stdarg.h>
1834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#include <time.h>
1934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
2034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#include <log/logger.h>
2134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#include <private/android_filesystem_config.h>
2234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#include <utils/String8.h>
2334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
2434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#include "LogStatistics.h"
2534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
2634facab86b0fe7ec613de92b46b637f864fb0682Mark SalyzynPidStatistics::PidStatistics(pid_t pid)
2734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        : pid(pid)
2834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        , mSizesTotal(0)
2934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        , mElementsTotal(0)
3034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        , mSizes(0)
3134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        , mElements(0) { }
3234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
3334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynvoid PidStatistics::add(unsigned short size) {
3434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    mSizesTotal += size;
3534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    ++mElementsTotal;
3634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    mSizes += size;
3734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    ++mElements;
3834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
3934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
4034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynbool PidStatistics::subtract(unsigned short size) {
4134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    mSizes -= size;
4234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    --mElements;
4334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    return mElements == 0 && kill(pid, 0);
4434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
4534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
4634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynvoid PidStatistics::addTotal(size_t size, size_t element) {
4734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    if (pid == gone) {
4834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        mSizesTotal += size;
4934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        mElementsTotal += element;
5034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
5134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
5234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
5334facab86b0fe7ec613de92b46b637f864fb0682Mark SalyzynUidStatistics::UidStatistics(uid_t uid)
5434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        : uid(uid) {
5534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    Pids.clear();
5634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
5734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
5834facab86b0fe7ec613de92b46b637f864fb0682Mark SalyzynUidStatistics::~UidStatistics() {
5934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    PidStatisticsCollection::iterator it;
6034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    for (it = begin(); it != end();) {
6134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        delete (*it);
6234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        it = Pids.erase(it);
6334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
6434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
6534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
6634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynvoid UidStatistics::add(unsigned short size, pid_t pid) {
6734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    PidStatistics *p;
6834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    PidStatisticsCollection::iterator last;
6934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    PidStatisticsCollection::iterator it;
7034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    for (last = it = begin(); it != end(); last = it, ++it) {
7134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        p = *it;
7234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        if (pid == p->getPid()) {
7334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            p->add(size);
7434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            // poor-man sort, bubble upwards if bigger than last
7534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            if ((last != it) && ((*last)->sizesTotal() < p->sizesTotal())) {
7634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                Pids.erase(it);
7734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                Pids.insert(last, p);
7834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            }
7934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            return;
8034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
8134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
8234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    // poor-man sort, insert if bigger than last or last is the gone entry.
8334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    bool insert = (last != it)
8434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        && ((p->getPid() == p->gone)
8534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            || ((*last)->sizesTotal() < (size_t) size));
8634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    p = new PidStatistics(pid);
8734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    if (insert) {
8834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        Pids.insert(last, p);
8934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    } else {
9034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        Pids.push_back(p);
9134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
9234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    p->add(size);
9334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
9434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
9534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynvoid UidStatistics::subtract(unsigned short size, pid_t pid) {
9634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    PidStatisticsCollection::iterator it;
9734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    for (it = begin(); it != end(); ++it) {
9834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        PidStatistics *p = *it;
9934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        if (pid == p->getPid()) {
10034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            if (p->subtract(size)) {
10134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                size_t szsTotal = p->sizesTotal();
10234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                size_t elsTotal = p->elementsTotal();
10334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                delete p;
10434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                Pids.erase(it);
10534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                it = end();
10634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                --it;
10734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                if (it == end()) {
10834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    p = new PidStatistics(p->gone);
10934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    Pids.push_back(p);
11034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                } else {
11134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    p = *it;
11234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    if (p->getPid() != p->gone) {
11334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                        p = new PidStatistics(p->gone);
11434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                        Pids.push_back(p);
11534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    }
11634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                }
11734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                p->addTotal(szsTotal, elsTotal);
11834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            }
11934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            return;
12034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
12134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
12234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
12334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
12434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t UidStatistics::sizes(pid_t pid) {
12534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    size_t sizes = 0;
12634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    PidStatisticsCollection::iterator it;
12734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    for (it = begin(); it != end(); ++it) {
12834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        PidStatistics *p = *it;
12934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        if ((pid == pid_all) || (pid == p->getPid())) {
13034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            sizes += p->sizes();
13134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
13234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
13334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    return sizes;
13434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
13534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
13634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t UidStatistics::elements(pid_t pid) {
13734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    size_t elements = 0;
13834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    PidStatisticsCollection::iterator it;
13934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    for (it = begin(); it != end(); ++it) {
14034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        PidStatistics *p = *it;
14134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        if ((pid == pid_all) || (pid == p->getPid())) {
14234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            elements += p->elements();
14334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
14434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
14534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    return elements;
14634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
14734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
14834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t UidStatistics::sizesTotal(pid_t pid) {
14934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    size_t sizes = 0;
15034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    PidStatisticsCollection::iterator it;
15134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    for (it = begin(); it != end(); ++it) {
15234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        PidStatistics *p = *it;
15334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        if ((pid == pid_all) || (pid == p->getPid())) {
15434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            sizes += p->sizesTotal();
15534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
15634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
15734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    return sizes;
15834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
15934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
16034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t UidStatistics::elementsTotal(pid_t pid) {
16134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    size_t elements = 0;
16234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    PidStatisticsCollection::iterator it;
16334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    for (it = begin(); it != end(); ++it) {
16434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        PidStatistics *p = *it;
16534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        if ((pid == pid_all) || (pid == p->getPid())) {
16634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            elements += p->elementsTotal();
16734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
16834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
16934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    return elements;
17034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
17134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
17234facab86b0fe7ec613de92b46b637f864fb0682Mark SalyzynLidStatistics::LidStatistics() {
17334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    Uids.clear();
17434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
17534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
17634facab86b0fe7ec613de92b46b637f864fb0682Mark SalyzynLidStatistics::~LidStatistics() {
17734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    UidStatisticsCollection::iterator it;
17834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    for (it = begin(); it != end();) {
17934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        delete (*it);
18034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        it = Uids.erase(it);
18134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
18234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
18334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
18434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynvoid LidStatistics::add(unsigned short size, uid_t uid, pid_t pid) {
18534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    UidStatistics *u;
18634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    UidStatisticsCollection::iterator it;
18734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    UidStatisticsCollection::iterator last;
18834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
18934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    if (uid == (uid_t) -1) { // init
19034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        uid = (uid_t) AID_ROOT;
19134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
19234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
19334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    for (last = it = begin(); it != end(); last = it, ++it) {
19434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        u = *it;
19534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        if (uid == u->getUid()) {
19634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            u->add(size, pid);
19734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            if ((last != it) && ((*last)->sizesTotal() < u->sizesTotal())) {
19834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                Uids.erase(it);
19934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                Uids.insert(last, u);
20034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            }
20134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            return;
20234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
20334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
20434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    u = new UidStatistics(uid);
20534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    if ((last != it) && ((*last)->sizesTotal() < (size_t) size)) {
20634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        Uids.insert(last, u);
20734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    } else {
20834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        Uids.push_back(u);
20934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
21034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    u->add(size, pid);
21134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
21234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
21334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynvoid LidStatistics::subtract(unsigned short size, uid_t uid, pid_t pid) {
21434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    UidStatisticsCollection::iterator it;
21534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    for (it = begin(); it != end(); ++it) {
21634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        UidStatistics *u = *it;
21734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        if (uid == u->getUid()) {
21834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            u->subtract(size, pid);
21934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            return;
22034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
22134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
22234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
22334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
22434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t LidStatistics::sizes(uid_t uid, pid_t pid) {
22534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    size_t sizes = 0;
22634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    UidStatisticsCollection::iterator it;
22734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    for (it = begin(); it != end(); ++it) {
22834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        UidStatistics *u = *it;
22934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        if ((uid == uid_all) || (uid == u->getUid())) {
23034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            sizes += u->sizes(pid);
23134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
23234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
23334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    return sizes;
23434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
23534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
23634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t LidStatistics::elements(uid_t uid, pid_t pid) {
23734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    size_t elements = 0;
23834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    UidStatisticsCollection::iterator it;
23934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    for (it = begin(); it != end(); ++it) {
24034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        UidStatistics *u = *it;
24134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        if ((uid == uid_all) || (uid == u->getUid())) {
24234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            elements += u->elements(pid);
24334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
24434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
24534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    return elements;
24634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
24734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
24834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t LidStatistics::sizesTotal(uid_t uid, pid_t pid) {
24934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    size_t sizes = 0;
25034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    UidStatisticsCollection::iterator it;
25134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    for (it = begin(); it != end(); ++it) {
25234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        UidStatistics *u = *it;
25334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        if ((uid == uid_all) || (uid == u->getUid())) {
25434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            sizes += u->sizesTotal(pid);
25534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
25634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
25734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    return sizes;
25834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
25934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
26034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t LidStatistics::elementsTotal(uid_t uid, pid_t pid) {
26134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    size_t elements = 0;
26234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    UidStatisticsCollection::iterator it;
26334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    for (it = begin(); it != end(); ++it) {
26434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        UidStatistics *u = *it;
26534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        if ((uid == uid_all) || (uid == u->getUid())) {
26634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            elements += u->elementsTotal(pid);
26734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
26834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
26934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    return elements;
27034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
27134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
27234facab86b0fe7ec613de92b46b637f864fb0682Mark SalyzynLogStatistics::LogStatistics()
27334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        : start(CLOCK_MONOTONIC) {
27434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    log_id_for_each(i) {
27534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        mSizes[i] = 0;
27634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        mElements[i] = 0;
27734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
27834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
27934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
28034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynvoid LogStatistics::add(unsigned short size,
28134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                        log_id_t log_id, uid_t uid, pid_t pid) {
28234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    mSizes[log_id] += size;
28334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    ++mElements[log_id];
28434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    id(log_id).add(size, uid, pid);
28534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
28634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
28734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynvoid LogStatistics::subtract(unsigned short size,
28834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                             log_id_t log_id, uid_t uid, pid_t pid) {
28934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    mSizes[log_id] -= size;
29034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    --mElements[log_id];
29134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    id(log_id).subtract(size, uid, pid);
29234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
29334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
29434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t LogStatistics::sizes(log_id_t log_id, uid_t uid, pid_t pid) {
29534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    if (log_id != log_id_all) {
29634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        return id(log_id).sizes(uid, pid);
29734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
29834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    size_t sizes = 0;
29934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    log_id_for_each(i) {
30034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        sizes += id(i).sizes(uid, pid);
30134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
30234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    return sizes;
30334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
30434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
30534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t LogStatistics::elements(log_id_t log_id, uid_t uid, pid_t pid) {
30634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    if (log_id != log_id_all) {
30734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        return id(log_id).elements(uid, pid);
30834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
30934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    size_t elements = 0;
31034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    log_id_for_each(i) {
31134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        elements += id(i).elements(uid, pid);
31234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
31334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    return elements;
31434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
31534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
31634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t LogStatistics::sizesTotal(log_id_t log_id, uid_t uid, pid_t pid) {
31734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    if (log_id != log_id_all) {
31834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        return id(log_id).sizesTotal(uid, pid);
31934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
32034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    size_t sizes = 0;
32134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    log_id_for_each(i) {
32234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        sizes += id(i).sizesTotal(uid, pid);
32334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
32434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    return sizes;
32534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
32634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
32734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t LogStatistics::elementsTotal(log_id_t log_id, uid_t uid, pid_t pid) {
32834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    if (log_id != log_id_all) {
32934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        return id(log_id).elementsTotal(uid, pid);
33034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
33134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    size_t elements = 0;
33234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    log_id_for_each(i) {
33334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        elements += id(i).elementsTotal(uid, pid);
33434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
33534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    return elements;
33634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
33734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
33834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t LogStatistics::format(char **buf,
33934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                             uid_t uid, unsigned int logMask, log_time oldest) {
34034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    const unsigned short spaces_current = 13;
34134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    const unsigned short spaces_total = 19;
34234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
34334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    if (*buf) {
34434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        free(buf);
34534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        *buf = NULL;
34634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
34734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
34834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    android::String8 string("        span -> size/num");
34934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    size_t oldLength;
35034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    short spaces = 2;
35134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
35234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    log_id_for_each(i) {
35334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        if (logMask & (1 << i)) {
35434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            oldLength = string.length();
35534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            string.appendFormat("%*s%s", spaces, "", android_log_id_to_name(i));
35634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            spaces += spaces_total + oldLength - string.length();
35734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
35834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
35934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
36034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    spaces = 1;
36134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    log_time t(CLOCK_MONOTONIC);
36234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    unsigned long long d = t.nsec() - start.nsec();
36334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    string.appendFormat("\nTotal%4llu:%02llu:%02llu.%09llu",
36434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                  d / NS_PER_SEC / 60 / 60, (d / NS_PER_SEC / 60) % 60,
36534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                  (d / NS_PER_SEC) % 60, d % NS_PER_SEC);
36634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
36734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    log_id_for_each(i) {
36834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        if (!(logMask & (1 << i))) {
36934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            continue;
37034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
37134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        oldLength = string.length();
37234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        string.appendFormat("%*s%zu/%zu", spaces, "",
37334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                            sizesTotal(i), elementsTotal(i));
37434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        spaces += spaces_total + oldLength - string.length();
37534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
37634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
37734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    spaces = 1;
37834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    d = t.nsec() - oldest.nsec();
37934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    string.appendFormat("\nNow%6llu:%02llu:%02llu.%09llu",
38034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                  d / NS_PER_SEC / 60 / 60, (d / NS_PER_SEC / 60) % 60,
38134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                  (d / NS_PER_SEC) % 60, d % NS_PER_SEC);
38234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
38334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    log_id_for_each(i) {
38434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        if (!(logMask & (1 << i))) {
38534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            continue;
38634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
38734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
38834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        size_t els = elements(i);
38934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        if (els) {
39034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            oldLength = string.length();
39134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            string.appendFormat("%*s%zu/%zu", spaces, "", sizes(i), els);
39234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            spaces -= string.length() - oldLength;
39334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
39434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        spaces += spaces_total;
39534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
39634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
39734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    log_id_for_each(i) {
39834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        if (!(logMask & (1 << i))) {
39934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            continue;
40034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
40134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
40234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        bool header = false;
40334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        bool first = true;
40434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
40534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        UidStatisticsCollection::iterator ut;
40634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        for(ut = id(i).begin(); ut != id(i).end(); ++ut) {
40734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            UidStatistics *up = *ut;
40834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            if ((uid != AID_ROOT) && (uid != up->getUid())) {
40934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                continue;
41034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            }
41134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
41234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            PidStatisticsCollection::iterator pt = up->begin();
41334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            if (pt == up->end()) {
41434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                continue;
41534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            }
41634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
41734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            android::String8 intermediate;
41834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
41934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            if (!header) {
42034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                // header below tuned to match spaces_total and spaces_current
42134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                spaces = 0;
42234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                intermediate = string.format("%s: UID/PID Total size/num",
42334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                                             android_log_id_to_name(i));
42434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                string.appendFormat("\n\n%-31sNow          "
42534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                                         "UID/PID[?]  Total              Now",
42634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                                    intermediate.string());
42734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                intermediate.clear();
42834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                header = true;
42934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            }
43034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
43134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            bool oneline = ++pt == up->end();
43234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            --pt;
43334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
43434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            if (!oneline) {
43534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                first = true;
43634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            } else if (!first && spaces) {
43734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                string.appendFormat("%*s", spaces, "");
43834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            }
43934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            spaces = 0;
44034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
44134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            uid_t u = up->getUid();
44234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            pid_t p = (*pt)->getPid();
44334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
44434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            intermediate = string.format(oneline
44534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                                             ? ((p == PidStatistics::gone)
44634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                                                 ? "%d/?"
44734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                                                 : "%d/%d")
44834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                                             : "%d",
44934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                                         u, p);
45034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            string.appendFormat((first) ? "\n%-12s" : "%-12s",
45134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                                intermediate.string());
45234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            intermediate.clear();
45334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
45434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            size_t elsTotal = up->elementsTotal();
45534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            oldLength = string.length();
45634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            string.appendFormat("%zu/%zu", up->sizesTotal(), elsTotal);
45734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            spaces += spaces_total + oldLength - string.length();
45834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
45934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            size_t els = up->elements();
46034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            if (els == elsTotal) {
46134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                string.appendFormat("%*s=", spaces, "");
46234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                spaces = -1;
46334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            } else if (els) {
46434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                oldLength = string.length();
46534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                string.appendFormat("%*s%zu/%zu", spaces, "", up->sizes(), els);
46634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                spaces -= string.length() - oldLength;
46734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            }
46834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            spaces += spaces_current;
46934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
47034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            first = !first;
47134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
47234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            if (oneline) {
47334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                continue;
47434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            }
47534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
47634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            size_t gone_szs = 0;
47734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            size_t gone_els = 0;
47834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
47934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            for(; pt != up->end(); ++pt) {
48034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                PidStatistics *pp = *pt;
48134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                pid_t p = pp->getPid();
48234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
48334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                // If a PID no longer has any current logs, and is not
48434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                // active anymore, skip & report totals for gone.
48534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                elsTotal = pp->elementsTotal();
48634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                size_t szsTotal = pp->sizesTotal();
48734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                if (p == pp->gone) {
48834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    gone_szs += szsTotal;
48934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    gone_els += elsTotal;
49034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    continue;
49134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                }
49234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                els = pp->elements();
49334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                bool gone = kill(p, 0);
49434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                if (gone && (els == 0)) {
49534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    // ToDo: garbage collection: move this statistical bucket
49634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    //       from its current UID/PID to UID/? (races and
49734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    //       wrap around are our achilles heel). Below is
49834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    //       merely lipservice to catch PIDs that were still
49934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    //       around when the stats were pruned to zero.
50034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    gone_szs += szsTotal;
50134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    gone_els += elsTotal;
50234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    continue;
50334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                }
50434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
50534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                if (!first && spaces) {
50634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    string.appendFormat("%*s", spaces, "");
50734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                }
50834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                spaces = 0;
50934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
51034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                intermediate = string.format((gone) ? "%d/%d?" : "%d/%d", u, p);
51134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                string.appendFormat((first) ? "\n%-12s" : "%-12s",
51234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                                    intermediate.string());
51334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                intermediate.clear();
51434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
51534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                oldLength = string.length();
51634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                string.appendFormat("%zu/%zu", szsTotal, elsTotal);
51734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                spaces += spaces_total + oldLength - string.length();
51834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
51934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                if (els == elsTotal) {
52034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    string.appendFormat("%*s=", spaces, "");
52134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    spaces = -1;
52234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                } else if (els) {
52334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    oldLength = string.length();
52434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    string.appendFormat("%*s%zu/%zu", spaces, "",
52534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                                        pp->sizes(), els);
52634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    spaces -= string.length() - oldLength;
52734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                }
52834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                spaces += spaces_current;
52934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
53034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                first = !first;
53134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            }
53234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
53334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            if (gone_els) {
53434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                if (!first && spaces) {
53534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    string.appendFormat("%*s", spaces, "");
53634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                }
53734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
53834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                intermediate = string.format("%d/?", u);
53934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                string.appendFormat((first) ? "\n%-12s" : "%-12s",
54034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                                    intermediate.string());
54134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                intermediate.clear();
54234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
54334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                spaces = spaces_total + spaces_current;
54434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
54534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                oldLength = string.length();
54634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                string.appendFormat("%zu/%zu", gone_szs, gone_els);
54734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                spaces -= string.length() - oldLength;
54834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
54934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                first = !first;
55034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            }
55134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
55234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
55334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
55434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    // Calculate total buffer size prefix
55534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    char re_fmt[32];
55634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    size_t ret;
55734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    for(size_t l = string.length(), y = 0, x = 6;
55834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn           y != x;
55934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn           y = x, x = strlen(re_fmt) - 2) {
56034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn       snprintf(re_fmt, sizeof(re_fmt), "%zu\n%%s\n\f", l + x);
56134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn       ret = l + x;
56234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
56334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
56434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    android::String8 intermediate = string.format(re_fmt, string.string());
56534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    string.clear();
56634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
56734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    *buf = strdup(intermediate.string());
56834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
56934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    return ret;
57034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
571