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
179a03863e88da99ba010342c874252089dd771f7fMark Salyzyn#include <fcntl.h>
1834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#include <stdarg.h>
1934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#include <time.h>
2034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
2134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#include <log/logger.h>
2234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#include <private/android_filesystem_config.h>
2334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#include <utils/String8.h>
2434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
2534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#include "LogStatistics.h"
2634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
279a03863e88da99ba010342c874252089dd771f7fMark SalyzynPidStatistics::PidStatistics(pid_t pid, char *name)
2834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        : pid(pid)
2934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        , mSizesTotal(0)
3034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        , mElementsTotal(0)
3134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        , mSizes(0)
329a03863e88da99ba010342c874252089dd771f7fMark Salyzyn        , mElements(0)
339a03863e88da99ba010342c874252089dd771f7fMark Salyzyn        , name(name)
34fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn        , mGone(false)
359a03863e88da99ba010342c874252089dd771f7fMark Salyzyn{ }
369a03863e88da99ba010342c874252089dd771f7fMark Salyzyn
379a03863e88da99ba010342c874252089dd771f7fMark Salyzyn#ifdef DO_NOT_ERROR_IF_PIDSTATISTICS_USES_A_COPY_CONSTRUCTOR
389a03863e88da99ba010342c874252089dd771f7fMark SalyzynPidStatistics::PidStatistics(const PidStatistics &copy)
399a03863e88da99ba010342c874252089dd771f7fMark Salyzyn        : pid(copy->pid)
409a03863e88da99ba010342c874252089dd771f7fMark Salyzyn        , name(copy->name ? strdup(copy->name) : NULL)
419a03863e88da99ba010342c874252089dd771f7fMark Salyzyn        , mSizesTotal(copy->mSizesTotal)
429a03863e88da99ba010342c874252089dd771f7fMark Salyzyn        , mElementsTotal(copy->mElementsTotal)
439a03863e88da99ba010342c874252089dd771f7fMark Salyzyn        , mSizes(copy->mSizes)
449a03863e88da99ba010342c874252089dd771f7fMark Salyzyn        , mElements(copy->mElements)
45fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn        , mGone(copy->mGone)
469a03863e88da99ba010342c874252089dd771f7fMark Salyzyn{ }
479a03863e88da99ba010342c874252089dd771f7fMark Salyzyn#endif
489a03863e88da99ba010342c874252089dd771f7fMark Salyzyn
499a03863e88da99ba010342c874252089dd771f7fMark SalyzynPidStatistics::~PidStatistics() {
509a03863e88da99ba010342c874252089dd771f7fMark Salyzyn    free(name);
519a03863e88da99ba010342c874252089dd771f7fMark Salyzyn}
529a03863e88da99ba010342c874252089dd771f7fMark Salyzyn
53fdabe7287609af29793bb6ca15712582ba082521Mark Salyzynbool PidStatistics::pidGone() {
54987f1e0de311cf863bde30bb4de19f9cd7f08642Mark Salyzyn    if (mGone || (pid == gone)) {
55fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn        return true;
56fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn    }
57260f3be3123e13b95b1f4e06f9404cac50c81e35Mark Salyzyn    if (pid == 0) {
58260f3be3123e13b95b1f4e06f9404cac50c81e35Mark Salyzyn        return false;
59260f3be3123e13b95b1f4e06f9404cac50c81e35Mark Salyzyn    }
60fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn    if (kill(pid, 0) && (errno != EPERM)) {
61fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn        mGone = true;
62fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn        return true;
63fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn    }
64fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn    return false;
65fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn}
66fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn
679a03863e88da99ba010342c874252089dd771f7fMark Salyzynvoid PidStatistics::setName(char *new_name) {
689a03863e88da99ba010342c874252089dd771f7fMark Salyzyn    free(name);
699a03863e88da99ba010342c874252089dd771f7fMark Salyzyn    name = new_name;
709a03863e88da99ba010342c874252089dd771f7fMark Salyzyn}
7134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
7234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynvoid PidStatistics::add(unsigned short size) {
7334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    mSizesTotal += size;
7434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    ++mElementsTotal;
7534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    mSizes += size;
7634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    ++mElements;
7734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
7834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
7934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynbool PidStatistics::subtract(unsigned short size) {
8034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    mSizes -= size;
8134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    --mElements;
82fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn    return (mElements == 0) && pidGone();
8334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
8434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
8534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynvoid PidStatistics::addTotal(size_t size, size_t element) {
8634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    if (pid == gone) {
8734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        mSizesTotal += size;
8834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        mElementsTotal += element;
8934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
9034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
9134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
929a03863e88da99ba010342c874252089dd771f7fMark Salyzyn// must call free to release return value
93987f1e0de311cf863bde30bb4de19f9cd7f08642Mark Salyzyn//  If only we could sniff our own logs for:
94987f1e0de311cf863bde30bb4de19f9cd7f08642Mark Salyzyn//   <time> <pid> <pid> E AndroidRuntime: Process: <name>, PID: <pid>
95987f1e0de311cf863bde30bb4de19f9cd7f08642Mark Salyzyn//  which debuggerd prints as a process is crashing.
969a03863e88da99ba010342c874252089dd771f7fMark Salyzynchar *PidStatistics::pidToName(pid_t pid) {
979a03863e88da99ba010342c874252089dd771f7fMark Salyzyn    char *retval = NULL;
98260f3be3123e13b95b1f4e06f9404cac50c81e35Mark Salyzyn    if (pid == 0) { // special case from auditd for kernel
99260f3be3123e13b95b1f4e06f9404cac50c81e35Mark Salyzyn        retval = strdup("logd.auditd");
100260f3be3123e13b95b1f4e06f9404cac50c81e35Mark Salyzyn    } else if (pid != gone) {
1019a03863e88da99ba010342c874252089dd771f7fMark Salyzyn        char buffer[512];
1029a03863e88da99ba010342c874252089dd771f7fMark Salyzyn        snprintf(buffer, sizeof(buffer), "/proc/%u/cmdline", pid);
1039a03863e88da99ba010342c874252089dd771f7fMark Salyzyn        int fd = open(buffer, O_RDONLY);
1049a03863e88da99ba010342c874252089dd771f7fMark Salyzyn        if (fd >= 0) {
1059a03863e88da99ba010342c874252089dd771f7fMark Salyzyn            ssize_t ret = read(fd, buffer, sizeof(buffer));
1069a03863e88da99ba010342c874252089dd771f7fMark Salyzyn            if (ret > 0) {
1079a03863e88da99ba010342c874252089dd771f7fMark Salyzyn                buffer[sizeof(buffer)-1] = '\0';
1089a03863e88da99ba010342c874252089dd771f7fMark Salyzyn                // frameworks intermediate state
1099a03863e88da99ba010342c874252089dd771f7fMark Salyzyn                if (strcmp(buffer, "<pre-initialized>")) {
1109a03863e88da99ba010342c874252089dd771f7fMark Salyzyn                    retval = strdup(buffer);
1119a03863e88da99ba010342c874252089dd771f7fMark Salyzyn                }
1129a03863e88da99ba010342c874252089dd771f7fMark Salyzyn            }
1139a03863e88da99ba010342c874252089dd771f7fMark Salyzyn            close(fd);
1149a03863e88da99ba010342c874252089dd771f7fMark Salyzyn        }
1159a03863e88da99ba010342c874252089dd771f7fMark Salyzyn    }
1169a03863e88da99ba010342c874252089dd771f7fMark Salyzyn    return retval;
1179a03863e88da99ba010342c874252089dd771f7fMark Salyzyn}
1189a03863e88da99ba010342c874252089dd771f7fMark Salyzyn
11934facab86b0fe7ec613de92b46b637f864fb0682Mark SalyzynUidStatistics::UidStatistics(uid_t uid)
120c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn        : uid(uid)
121c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn        , mSizes(0)
122c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn        , mElements(0) {
12334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    Pids.clear();
12434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
12534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
12634facab86b0fe7ec613de92b46b637f864fb0682Mark SalyzynUidStatistics::~UidStatistics() {
12734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    PidStatisticsCollection::iterator it;
12834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    for (it = begin(); it != end();) {
12934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        delete (*it);
130987f1e0de311cf863bde30bb4de19f9cd7f08642Mark Salyzyn        it = erase(it);
13134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
13234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
13334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
13434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynvoid UidStatistics::add(unsigned short size, pid_t pid) {
135c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn    mSizes += size;
136c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn    ++mElements;
137c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn
138987f1e0de311cf863bde30bb4de19f9cd7f08642Mark Salyzyn    PidStatistics *p = NULL;
13934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    PidStatisticsCollection::iterator last;
14034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    PidStatisticsCollection::iterator it;
14134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    for (last = it = begin(); it != end(); last = it, ++it) {
14234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        p = *it;
14334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        if (pid == p->getPid()) {
14434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            p->add(size);
14534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            return;
14634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
14734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
148c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn    // insert if the gone entry.
149987f1e0de311cf863bde30bb4de19f9cd7f08642Mark Salyzyn    bool insert_before_last = (last != it) && p && (p->getPid() == p->gone);
1509a03863e88da99ba010342c874252089dd771f7fMark Salyzyn    p = new PidStatistics(pid, pidToName(pid));
151987f1e0de311cf863bde30bb4de19f9cd7f08642Mark Salyzyn    if (insert_before_last) {
152987f1e0de311cf863bde30bb4de19f9cd7f08642Mark Salyzyn        insert(last, p);
15334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    } else {
154987f1e0de311cf863bde30bb4de19f9cd7f08642Mark Salyzyn        push_back(p);
15534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
15634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    p->add(size);
15734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
15834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
15934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynvoid UidStatistics::subtract(unsigned short size, pid_t pid) {
160c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn    mSizes -= size;
161c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn    --mElements;
162c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn
16334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    PidStatisticsCollection::iterator it;
16434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    for (it = begin(); it != end(); ++it) {
16534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        PidStatistics *p = *it;
16634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        if (pid == p->getPid()) {
16734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            if (p->subtract(size)) {
16834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                size_t szsTotal = p->sizesTotal();
16934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                size_t elsTotal = p->elementsTotal();
17034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                delete p;
171987f1e0de311cf863bde30bb4de19f9cd7f08642Mark Salyzyn                erase(it);
17234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                it = end();
17334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                --it;
17434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                if (it == end()) {
17534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    p = new PidStatistics(p->gone);
176987f1e0de311cf863bde30bb4de19f9cd7f08642Mark Salyzyn                    push_back(p);
17734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                } else {
17834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    p = *it;
17934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    if (p->getPid() != p->gone) {
18034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                        p = new PidStatistics(p->gone);
181987f1e0de311cf863bde30bb4de19f9cd7f08642Mark Salyzyn                        push_back(p);
18234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    }
18334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                }
18434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                p->addTotal(szsTotal, elsTotal);
18534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            }
18634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            return;
18734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
18834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
18934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
19034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
191c8a576c637ae00577273b778498019dd609fcd15Mark Salyzynvoid UidStatistics::sort() {
192c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn    for (bool pass = true; pass;) {
193c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn        pass = false;
194c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn        PidStatisticsCollection::iterator it = begin();
195c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn        if (it != end()) {
196c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn            PidStatisticsCollection::iterator lt = it;
197c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn            PidStatistics *l = (*lt);
198c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn            while (++it != end()) {
199c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn                PidStatistics *n = (*it);
200c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn                if ((n->getPid() != n->gone) && (n->sizes() > l->sizes())) {
201c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn                    pass = true;
202987f1e0de311cf863bde30bb4de19f9cd7f08642Mark Salyzyn                    erase(it);
203987f1e0de311cf863bde30bb4de19f9cd7f08642Mark Salyzyn                    insert(lt, n);
204c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn                    it = lt;
205c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn                    n = l;
206c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn                }
207c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn                lt = it;
208c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn                l = n;
209c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn            }
210c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn        }
211c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn    }
212c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn}
213c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn
21434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t UidStatistics::sizes(pid_t pid) {
215c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn    if (pid == pid_all) {
216c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn        return sizes();
217c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn    }
218c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn
21934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    PidStatisticsCollection::iterator it;
22034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    for (it = begin(); it != end(); ++it) {
22134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        PidStatistics *p = *it;
222c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn        if (pid == p->getPid()) {
223c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn            return p->sizes();
22434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
22534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
226c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn    return 0;
22734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
22834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
22934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t UidStatistics::elements(pid_t pid) {
230c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn    if (pid == pid_all) {
231c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn        return elements();
232c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn    }
233c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn
23434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    PidStatisticsCollection::iterator it;
23534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    for (it = begin(); it != end(); ++it) {
23634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        PidStatistics *p = *it;
237c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn        if (pid == p->getPid()) {
238c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn            return p->elements();
23934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
24034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
241c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn    return 0;
24234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
24334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
24434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t UidStatistics::sizesTotal(pid_t pid) {
24534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    size_t sizes = 0;
24634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    PidStatisticsCollection::iterator it;
24734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    for (it = begin(); it != end(); ++it) {
24834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        PidStatistics *p = *it;
24934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        if ((pid == pid_all) || (pid == p->getPid())) {
25034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            sizes += p->sizesTotal();
25134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
25234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
25334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    return sizes;
25434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
25534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
25634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t UidStatistics::elementsTotal(pid_t pid) {
25734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    size_t elements = 0;
25834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    PidStatisticsCollection::iterator it;
25934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    for (it = begin(); it != end(); ++it) {
26034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        PidStatistics *p = *it;
26134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        if ((pid == pid_all) || (pid == p->getPid())) {
26234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            elements += p->elementsTotal();
26334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
26434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
26534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    return elements;
26634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
26734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
26834facab86b0fe7ec613de92b46b637f864fb0682Mark SalyzynLidStatistics::LidStatistics() {
26934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    Uids.clear();
27034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
27134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
27234facab86b0fe7ec613de92b46b637f864fb0682Mark SalyzynLidStatistics::~LidStatistics() {
27334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    UidStatisticsCollection::iterator it;
27434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    for (it = begin(); it != end();) {
27534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        delete (*it);
27634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        it = Uids.erase(it);
27734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
27834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
27934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
28034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynvoid LidStatistics::add(unsigned short size, uid_t uid, pid_t pid) {
28134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    UidStatistics *u;
28234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    UidStatisticsCollection::iterator it;
28334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    UidStatisticsCollection::iterator last;
28434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
28534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    if (uid == (uid_t) -1) { // init
28634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        uid = (uid_t) AID_ROOT;
28734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
28834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
28934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    for (last = it = begin(); it != end(); last = it, ++it) {
29034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        u = *it;
29134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        if (uid == u->getUid()) {
29234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            u->add(size, pid);
29334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            if ((last != it) && ((*last)->sizesTotal() < u->sizesTotal())) {
29434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                Uids.erase(it);
29534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                Uids.insert(last, u);
29634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            }
29734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            return;
29834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
29934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
30034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    u = new UidStatistics(uid);
30134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    if ((last != it) && ((*last)->sizesTotal() < (size_t) size)) {
30234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        Uids.insert(last, u);
30334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    } else {
30434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        Uids.push_back(u);
30534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
30634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    u->add(size, pid);
30734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
30834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
30934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynvoid LidStatistics::subtract(unsigned short size, uid_t uid, pid_t pid) {
3101e1d71e26c83cb1fb5ffbf2f809a9f000dfbdd50Mark Salyzyn    if (uid == (uid_t) -1) { // init
3111e1d71e26c83cb1fb5ffbf2f809a9f000dfbdd50Mark Salyzyn        uid = (uid_t) AID_ROOT;
3121e1d71e26c83cb1fb5ffbf2f809a9f000dfbdd50Mark Salyzyn    }
3131e1d71e26c83cb1fb5ffbf2f809a9f000dfbdd50Mark Salyzyn
31434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    UidStatisticsCollection::iterator it;
31534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    for (it = begin(); it != end(); ++it) {
31634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        UidStatistics *u = *it;
31734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        if (uid == u->getUid()) {
31834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            u->subtract(size, pid);
31934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            return;
32034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
32134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
32234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
32334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
324c8a576c637ae00577273b778498019dd609fcd15Mark Salyzynvoid LidStatistics::sort() {
325c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn    for (bool pass = true; pass;) {
326c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn        pass = false;
327c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn        UidStatisticsCollection::iterator it = begin();
328c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn        if (it != end()) {
329c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn            UidStatisticsCollection::iterator lt = it;
330c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn            UidStatistics *l = (*lt);
331c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn            while (++it != end()) {
332c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn                UidStatistics *n = (*it);
333c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn                if (n->sizes() > l->sizes()) {
334c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn                    pass = true;
335c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn                    Uids.erase(it);
336c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn                    Uids.insert(lt, n);
337c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn                    it = lt;
338c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn                    n = l;
339c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn                }
340c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn                lt = it;
341c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn                l = n;
342c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn            }
343c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn        }
344c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn    }
345c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn}
346c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn
34734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t LidStatistics::sizes(uid_t uid, pid_t pid) {
34834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    size_t sizes = 0;
34934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    UidStatisticsCollection::iterator it;
35034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    for (it = begin(); it != end(); ++it) {
35134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        UidStatistics *u = *it;
35234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        if ((uid == uid_all) || (uid == u->getUid())) {
35334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            sizes += u->sizes(pid);
35434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
35534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
35634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    return sizes;
35734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
35834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
35934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t LidStatistics::elements(uid_t uid, pid_t pid) {
36034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    size_t elements = 0;
36134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    UidStatisticsCollection::iterator it;
36234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    for (it = begin(); it != end(); ++it) {
36334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        UidStatistics *u = *it;
36434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        if ((uid == uid_all) || (uid == u->getUid())) {
36534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            elements += u->elements(pid);
36634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
36734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
36834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    return elements;
36934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
37034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
37134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t LidStatistics::sizesTotal(uid_t uid, pid_t pid) {
37234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    size_t sizes = 0;
37334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    UidStatisticsCollection::iterator it;
37434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    for (it = begin(); it != end(); ++it) {
37534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        UidStatistics *u = *it;
37634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        if ((uid == uid_all) || (uid == u->getUid())) {
37734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            sizes += u->sizesTotal(pid);
37834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
37934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
38034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    return sizes;
38134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
38234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
38334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t LidStatistics::elementsTotal(uid_t uid, pid_t pid) {
38434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    size_t elements = 0;
38534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    UidStatisticsCollection::iterator it;
38634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    for (it = begin(); it != end(); ++it) {
38734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        UidStatistics *u = *it;
38834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        if ((uid == uid_all) || (uid == u->getUid())) {
38934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            elements += u->elementsTotal(pid);
39034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
39134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
39234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    return elements;
39334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
39434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
39534facab86b0fe7ec613de92b46b637f864fb0682Mark SalyzynLogStatistics::LogStatistics()
396a0e53540daa67142abd93756fad38a69eab8fbceMark Salyzyn        : mStatistics(false)
397a0e53540daa67142abd93756fad38a69eab8fbceMark Salyzyn        , dgramQlenStatistics(false)
398987f1e0de311cf863bde30bb4de19f9cd7f08642Mark Salyzyn        , start(CLOCK_MONOTONIC) {
39934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    log_id_for_each(i) {
40034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        mSizes[i] = 0;
40134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        mElements[i] = 0;
40234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
403e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn
404987f1e0de311cf863bde30bb4de19f9cd7f08642Mark Salyzyn    for(unsigned short bucket = 0; dgramQlen(bucket); ++bucket) {
4053cb54987857690fa5b73f0192cc052eb55b562f7Mark Salyzyn        mMinimum[bucket].tv_sec = mMinimum[bucket].tv_sec_max;
4063cb54987857690fa5b73f0192cc052eb55b562f7Mark Salyzyn        mMinimum[bucket].tv_nsec = mMinimum[bucket].tv_nsec_max;
407e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn    }
408e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn}
409e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn
410987f1e0de311cf863bde30bb4de19f9cd7f08642Mark Salyzyn//   Each bucket below represents a dgramQlen of log messages. By
411e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn//   finding the minimum period of time from start to finish
412987f1e0de311cf863bde30bb4de19f9cd7f08642Mark Salyzyn//   of each dgramQlen, we can get a performance expectation for
413e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn//   the user space logger. The net result is that the period
414987f1e0de311cf863bde30bb4de19f9cd7f08642Mark Salyzyn//   of time divided by the dgramQlen will give us the average time
415e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn//   between log messages; at the point where the average time
416e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn//   is greater than the throughput capability of the logger
417e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn//   we will not longer require the benefits of the FIFO formed
418e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn//   by max_dgram_qlen. We will also expect to see a very visible
419e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn//   knee in the average time between log messages at this point,
420e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn//   so we do not necessarily have to compare the rate against the
421e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn//   measured performance (BM_log_maximum_retry) of the logger.
422e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn//
423e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn//   for example (reformatted):
424e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn//
425987f1e0de311cf863bde30bb4de19f9cd7f08642Mark Salyzyn//       Minimum time between log events per dgramQlen:
426e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn//       1   2   3   5   10  20  30  50  100  200 300 400 500 600
427e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn//       5u2 12u 13u 15u 16u 27u 30u 36u 407u 3m1 3m3 3m9 3m9 5m5
428e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn//
429e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn//   demonstrates a clear knee rising at 100, so this means that for this
430e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn//   case max_dgram_qlen = 100 would be more than sufficient to handle the
431e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn//   worst that the system could stuff into the logger. The
432e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn//   BM_log_maximum_retry performance (derated by the log collection) on the
433e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn//   same system was 33.2us so we would almost be fine with max_dgram_qlen = 50.
434e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn//   BM_log_maxumum_retry with statistics off is roughly 20us, so
435e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn//   max_dgram_qlen = 20 would work. We will be more than willing to have
436e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn//   a large engineering margin so the rule of thumb that lead us to 100 is
437e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn//   fine.
438e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn//
439987f1e0de311cf863bde30bb4de19f9cd7f08642Mark Salyzyn// bucket dgramQlen are tuned for /proc/sys/net/unix/max_dgram_qlen = 300
440e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzynconst unsigned short LogStatistics::mBuckets[] = {
441e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn    1, 2, 3, 5, 10, 20, 30, 50, 100, 200, 300, 400, 500, 600
442e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn};
443e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn
444987f1e0de311cf863bde30bb4de19f9cd7f08642Mark Salyzynunsigned short LogStatistics::dgramQlen(unsigned short bucket) {
445e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn    if (bucket >= sizeof(mBuckets) / sizeof(mBuckets[0])) {
446e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn        return 0;
447e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn    }
448e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn    return mBuckets[bucket];
449e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn}
450e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn
451e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzynunsigned long long LogStatistics::minimum(unsigned short bucket) {
4523cb54987857690fa5b73f0192cc052eb55b562f7Mark Salyzyn    if (mMinimum[bucket].tv_sec == mMinimum[bucket].tv_sec_max) {
453e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn        return 0;
454e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn    }
455e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn    return mMinimum[bucket].nsec();
456e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn}
457e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn
458e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzynvoid LogStatistics::recordDiff(log_time diff, unsigned short bucket) {
459e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn    if ((diff.tv_sec || diff.tv_nsec) && (mMinimum[bucket] > diff)) {
460e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn        mMinimum[bucket] = diff;
461e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn    }
46234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
46334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
46434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynvoid LogStatistics::add(unsigned short size,
46534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                        log_id_t log_id, uid_t uid, pid_t pid) {
46634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    mSizes[log_id] += size;
46734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    ++mElements[log_id];
468a0e53540daa67142abd93756fad38a69eab8fbceMark Salyzyn    if (!mStatistics) {
469a0e53540daa67142abd93756fad38a69eab8fbceMark Salyzyn        return;
470a0e53540daa67142abd93756fad38a69eab8fbceMark Salyzyn    }
47134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    id(log_id).add(size, uid, pid);
47234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
47334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
47434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynvoid LogStatistics::subtract(unsigned short size,
47534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                             log_id_t log_id, uid_t uid, pid_t pid) {
47634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    mSizes[log_id] -= size;
47734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    --mElements[log_id];
478a0e53540daa67142abd93756fad38a69eab8fbceMark Salyzyn    if (!mStatistics) {
479a0e53540daa67142abd93756fad38a69eab8fbceMark Salyzyn        return;
480a0e53540daa67142abd93756fad38a69eab8fbceMark Salyzyn    }
48134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    id(log_id).subtract(size, uid, pid);
48234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
48334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
48434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t LogStatistics::sizes(log_id_t log_id, uid_t uid, pid_t pid) {
48534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    if (log_id != log_id_all) {
48634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        return id(log_id).sizes(uid, pid);
48734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
48834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    size_t sizes = 0;
48934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    log_id_for_each(i) {
49034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        sizes += id(i).sizes(uid, pid);
49134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
49234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    return sizes;
49334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
49434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
49534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t LogStatistics::elements(log_id_t log_id, uid_t uid, pid_t pid) {
49634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    if (log_id != log_id_all) {
49734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        return id(log_id).elements(uid, pid);
49834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
49934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    size_t elements = 0;
50034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    log_id_for_each(i) {
50134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        elements += id(i).elements(uid, pid);
50234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
50334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    return elements;
50434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
50534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
50634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t LogStatistics::sizesTotal(log_id_t log_id, uid_t uid, pid_t pid) {
50734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    if (log_id != log_id_all) {
50834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        return id(log_id).sizesTotal(uid, pid);
50934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
51034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    size_t sizes = 0;
51134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    log_id_for_each(i) {
51234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        sizes += id(i).sizesTotal(uid, pid);
51334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
51434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    return sizes;
51534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
51634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
51734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t LogStatistics::elementsTotal(log_id_t log_id, uid_t uid, pid_t pid) {
51834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    if (log_id != log_id_all) {
51934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        return id(log_id).elementsTotal(uid, pid);
52034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
52134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    size_t elements = 0;
52234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    log_id_for_each(i) {
52334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        elements += id(i).elementsTotal(uid, pid);
52434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
52534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    return elements;
52634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
52734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
528dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzynvoid LogStatistics::format(char **buf,
529dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn                           uid_t uid, unsigned int logMask, log_time oldest) {
5309a03863e88da99ba010342c874252089dd771f7fMark Salyzyn    static const unsigned short spaces_current = 13;
5319a03863e88da99ba010342c874252089dd771f7fMark Salyzyn    static const unsigned short spaces_total = 19;
53234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
53334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    if (*buf) {
534239605ef64d34ced82c97870e3f3f5c4145be58cGreg Hackmann        free(*buf);
53534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        *buf = NULL;
53634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
53734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
53834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    android::String8 string("        span -> size/num");
53934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    size_t oldLength;
54034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    short spaces = 2;
54134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
54234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    log_id_for_each(i) {
5433c8e92cebe9f5246f502d9e82d16f9621ac0bed7Arseniy Antonov        if (!(logMask & (1 << i))) {
544c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn            continue;
545c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn        }
546c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn        oldLength = string.length();
547c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn        if (spaces < 0) {
548c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn            spaces = 0;
549c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn        }
550c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn        string.appendFormat("%*s%s", spaces, "", android_log_id_to_name(i));
551c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn        spaces += spaces_total + oldLength - string.length();
552c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn
553c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn        LidStatistics &l = id(i);
554c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn        l.sort();
555c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn
556c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn        UidStatisticsCollection::iterator iu;
557c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn        for (iu = l.begin(); iu != l.end(); ++iu) {
558c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn            (*iu)->sort();
55934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
56034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
56134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
56234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    spaces = 1;
56334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    log_time t(CLOCK_MONOTONIC);
564a0e53540daa67142abd93756fad38a69eab8fbceMark Salyzyn    unsigned long long d;
565a0e53540daa67142abd93756fad38a69eab8fbceMark Salyzyn    if (mStatistics) {
566a0e53540daa67142abd93756fad38a69eab8fbceMark Salyzyn        d = t.nsec() - start.nsec();
567a0e53540daa67142abd93756fad38a69eab8fbceMark Salyzyn        string.appendFormat("\nTotal%4llu:%02llu:%02llu.%09llu",
56834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                  d / NS_PER_SEC / 60 / 60, (d / NS_PER_SEC / 60) % 60,
56934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                  (d / NS_PER_SEC) % 60, d % NS_PER_SEC);
57034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
571a0e53540daa67142abd93756fad38a69eab8fbceMark Salyzyn        log_id_for_each(i) {
572a0e53540daa67142abd93756fad38a69eab8fbceMark Salyzyn            if (!(logMask & (1 << i))) {
573a0e53540daa67142abd93756fad38a69eab8fbceMark Salyzyn                continue;
574a0e53540daa67142abd93756fad38a69eab8fbceMark Salyzyn            }
575a0e53540daa67142abd93756fad38a69eab8fbceMark Salyzyn            oldLength = string.length();
576a0e53540daa67142abd93756fad38a69eab8fbceMark Salyzyn            if (spaces < 0) {
577a0e53540daa67142abd93756fad38a69eab8fbceMark Salyzyn                spaces = 0;
578a0e53540daa67142abd93756fad38a69eab8fbceMark Salyzyn            }
579a0e53540daa67142abd93756fad38a69eab8fbceMark Salyzyn            string.appendFormat("%*s%zu/%zu", spaces, "",
580a0e53540daa67142abd93756fad38a69eab8fbceMark Salyzyn                                sizesTotal(i), elementsTotal(i));
581a0e53540daa67142abd93756fad38a69eab8fbceMark Salyzyn            spaces += spaces_total + oldLength - string.length();
582e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn        }
583a0e53540daa67142abd93756fad38a69eab8fbceMark Salyzyn        spaces = 1;
58434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
58534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
58634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    d = t.nsec() - oldest.nsec();
58734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    string.appendFormat("\nNow%6llu:%02llu:%02llu.%09llu",
58834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                  d / NS_PER_SEC / 60 / 60, (d / NS_PER_SEC / 60) % 60,
58934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                  (d / NS_PER_SEC) % 60, d % NS_PER_SEC);
59034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
59134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    log_id_for_each(i) {
59234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        if (!(logMask & (1 << i))) {
59334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            continue;
59434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
59534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
59634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        size_t els = elements(i);
59734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        if (els) {
59834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            oldLength = string.length();
599e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn            if (spaces < 0) {
600e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                spaces = 0;
601e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn            }
60234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            string.appendFormat("%*s%zu/%zu", spaces, "", sizes(i), els);
60334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            spaces -= string.length() - oldLength;
60434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
60534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        spaces += spaces_total;
60634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
60734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
6088e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn    // Construct list of worst spammers by Pid
6098e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn    static const unsigned char num_spammers = 10;
6108e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn    bool header = false;
6118e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn
6128e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn    log_id_for_each(i) {
6138e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn        if (!(logMask & (1 << i))) {
6148e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn            continue;
6158e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn        }
6168e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn
6178e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn        PidStatisticsCollection pids;
6188e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn        pids.clear();
6198e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn
6208e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn        LidStatistics &l = id(i);
6218e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn        UidStatisticsCollection::iterator iu;
6228e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn        for (iu = l.begin(); iu != l.end(); ++iu) {
6238e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn            UidStatistics &u = *(*iu);
6248e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn            PidStatisticsCollection::iterator ip;
6258e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn            for (ip = u.begin(); ip != u.end(); ++ip) {
6268e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                PidStatistics *p = (*ip);
6278e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                if (p->getPid() == p->gone) {
6288e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                    break;
6298e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                }
6308e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn
6318e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                size_t mySizes = p->sizes();
6328e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn
6338e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                PidStatisticsCollection::iterator q;
6348e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                unsigned char num = 0;
6358e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                for (q = pids.begin(); q != pids.end(); ++q) {
6368e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                    if (mySizes > (*q)->sizes()) {
6378e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                        pids.insert(q, p);
6388e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                        break;
6398e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                    }
6408e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                    // do we need to traverse deeper in the list?
6418e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                    if (++num > num_spammers) {
6428e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                        break;
6438e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                    }
6448e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                }
6458e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                if (q == pids.end()) {
6468e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                   pids.push_back(p);
6478e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                }
6488e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn            }
6498e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn        }
6508e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn
6518e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn        size_t threshold = sizes(i);
6528e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn        if (threshold < 65536) {
6538e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn            threshold = 65536;
6548e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn        }
6558e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn        threshold /= 100;
6568e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn
6578e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn        PidStatisticsCollection::iterator pt = pids.begin();
6588e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn
6598e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn        for(int line = 0;
6608e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                (pt != pids.end()) && (line < num_spammers);
6618e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                ++line, pt = pids.erase(pt)) {
6628e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn            PidStatistics *p = *pt;
6638e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn
6648e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn            size_t sizes = p->sizes();
6658e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn            if (sizes < threshold) {
6668e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                break;
6678e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn            }
6688e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn
6698e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn            char *name = p->getName();
6708e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn            pid_t pid = p->getPid();
6718e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn            if (!name || !*name) {
6728e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                name = pidToName(pid);
6738e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                if (name) {
6748e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                    if (*name) {
6758e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                        p->setName(name);
6768e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                    } else {
6778e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                        free(name);
6788e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                        name = NULL;
6798e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                    }
6808e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                }
6818e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn            }
6828e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn
6838e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn            if (!header) {
6848e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                string.appendFormat("\n\nChattiest clients:\n"
6858e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                                    "log id %-*s PID[?] name",
6868e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                                    spaces_total, "size/total");
6878e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                header = true;
6888e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn            }
6898e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn
6908e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn            size_t sizesTotal = p->sizesTotal();
6918e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn
6928e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn            android::String8 sz("");
6938e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn            sz.appendFormat((sizes != sizesTotal) ? "%zu/%zu" : "%zu",
6948e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                            sizes, sizesTotal);
6958e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn
6968e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn            android::String8 pd("");
697fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn            pd.appendFormat("%u%c", pid, p->pidGone() ? '?' : ' ');
6988e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn
6998e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn            string.appendFormat("\n%-7s%-*s %-7s%s",
7008e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                                line ? "" : android_log_id_to_name(i),
7018e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                                spaces_total, sz.string(), pd.string(),
7028e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                                name ? name : "");
7038e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn        }
7048e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn
7058e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn        pids.clear();
7068e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn    }
7078e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn
708987f1e0de311cf863bde30bb4de19f9cd7f08642Mark Salyzyn    if (dgramQlenStatistics) {
709e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn        const unsigned short spaces_time = 6;
710e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn        const unsigned long long max_seconds = 100000;
711e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn        spaces = 0;
712987f1e0de311cf863bde30bb4de19f9cd7f08642Mark Salyzyn        string.append("\n\nMinimum time between log events per max_dgram_qlen:\n");
713987f1e0de311cf863bde30bb4de19f9cd7f08642Mark Salyzyn        for(unsigned short i = 0; dgramQlen(i); ++i) {
714e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn            oldLength = string.length();
715e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn            if (spaces < 0) {
716e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                spaces = 0;
717e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn            }
718987f1e0de311cf863bde30bb4de19f9cd7f08642Mark Salyzyn            string.appendFormat("%*s%u", spaces, "", dgramQlen(i));
719e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn            spaces += spaces_time + oldLength - string.length();
720e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn        }
721e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn        string.append("\n");
722e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn        spaces = 0;
723e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn        unsigned short n;
724987f1e0de311cf863bde30bb4de19f9cd7f08642Mark Salyzyn        for(unsigned short i = 0; (n = dgramQlen(i)); ++i) {
725e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn            unsigned long long duration = minimum(i);
726e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn            if (duration) {
727e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                duration /= n;
728e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                if (duration >= (NS_PER_SEC * max_seconds)) {
729e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                    duration = NS_PER_SEC * (max_seconds - 1);
730e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                }
731e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                oldLength = string.length();
732e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                if (spaces < 0) {
733e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                    spaces = 0;
734e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                }
735e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                string.appendFormat("%*s", spaces, "");
736e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                if (duration >= (NS_PER_SEC * 10)) {
737e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                    string.appendFormat("%llu",
738e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                        (duration + (NS_PER_SEC / 2))
739e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                            / NS_PER_SEC);
740e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                } else if (duration >= (NS_PER_SEC / (1000 / 10))) {
741e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                    string.appendFormat("%llum",
742e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                        (duration + (NS_PER_SEC / 2 / 1000))
743e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                            / (NS_PER_SEC / 1000));
744e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                } else if (duration >= (NS_PER_SEC / (1000000 / 10))) {
745e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                    string.appendFormat("%lluu",
746987f1e0de311cf863bde30bb4de19f9cd7f08642Mark Salyzyn                        (duration + (NS_PER_SEC / 2 / 1000000))
747987f1e0de311cf863bde30bb4de19f9cd7f08642Mark Salyzyn                            / (NS_PER_SEC / 1000000));
748e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                } else {
749e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                    string.appendFormat("%llun", duration);
750e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                }
751e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                spaces -= string.length() - oldLength;
752e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn            }
753e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn            spaces += spaces_time;
754e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn        }
755e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn    }
756e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn
75734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    log_id_for_each(i) {
75834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        if (!(logMask & (1 << i))) {
75934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            continue;
76034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
76134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
7628e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn        header = false;
76334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        bool first = true;
76434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
76534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        UidStatisticsCollection::iterator ut;
76634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        for(ut = id(i).begin(); ut != id(i).end(); ++ut) {
76734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            UidStatistics *up = *ut;
76834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            if ((uid != AID_ROOT) && (uid != up->getUid())) {
76934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                continue;
77034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            }
77134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
77234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            PidStatisticsCollection::iterator pt = up->begin();
77334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            if (pt == up->end()) {
77434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                continue;
77534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            }
77634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
77734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            android::String8 intermediate;
77834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
77934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            if (!header) {
78034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                // header below tuned to match spaces_total and spaces_current
78134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                spaces = 0;
78234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                intermediate = string.format("%s: UID/PID Total size/num",
78334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                                             android_log_id_to_name(i));
78434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                string.appendFormat("\n\n%-31sNow          "
78534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                                         "UID/PID[?]  Total              Now",
78634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                                    intermediate.string());
78734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                intermediate.clear();
78834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                header = true;
78934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            }
79034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
79134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            bool oneline = ++pt == up->end();
79234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            --pt;
79334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
79434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            if (!oneline) {
79534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                first = true;
796e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn            } else if (!first && (spaces > 0)) {
79734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                string.appendFormat("%*s", spaces, "");
79834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            }
79934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            spaces = 0;
80034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
80134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            uid_t u = up->getUid();
802fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn            PidStatistics *pp = *pt;
803fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn            pid_t p = pp->getPid();
80434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
80534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            intermediate = string.format(oneline
80634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                                             ? ((p == PidStatistics::gone)
80734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                                                 ? "%d/?"
808fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn                                                 : "%d/%d%c")
80934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                                             : "%d",
810fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn                                         u, p, pp->pidGone() ? '?' : '\0');
8118e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn            string.appendFormat(first ? "\n%-12s" : "%-12s",
81234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                                intermediate.string());
81334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            intermediate.clear();
81434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
81534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            size_t elsTotal = up->elementsTotal();
81634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            oldLength = string.length();
81734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            string.appendFormat("%zu/%zu", up->sizesTotal(), elsTotal);
81834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            spaces += spaces_total + oldLength - string.length();
81934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
82034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            size_t els = up->elements();
82134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            if (els == elsTotal) {
822e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                if (spaces < 0) {
823e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                    spaces = 0;
824e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                }
82534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                string.appendFormat("%*s=", spaces, "");
82634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                spaces = -1;
82734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            } else if (els) {
82834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                oldLength = string.length();
829e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                if (spaces < 0) {
830e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                    spaces = 0;
831e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                }
83234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                string.appendFormat("%*s%zu/%zu", spaces, "", up->sizes(), els);
83334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                spaces -= string.length() - oldLength;
83434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            }
83534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            spaces += spaces_current;
83634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
83734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            first = !first;
83834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
83934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            if (oneline) {
84034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                continue;
84134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            }
84234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
84334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            size_t gone_szs = 0;
84434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            size_t gone_els = 0;
84534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
84634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            for(; pt != up->end(); ++pt) {
847fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn                pp = *pt;
848fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn                p = pp->getPid();
84934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
85034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                // If a PID no longer has any current logs, and is not
85134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                // active anymore, skip & report totals for gone.
85234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                elsTotal = pp->elementsTotal();
85334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                size_t szsTotal = pp->sizesTotal();
85434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                if (p == pp->gone) {
85534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    gone_szs += szsTotal;
85634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    gone_els += elsTotal;
85734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    continue;
85834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                }
85934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                els = pp->elements();
860fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn                bool gone = pp->pidGone();
86134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                if (gone && (els == 0)) {
86234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    // ToDo: garbage collection: move this statistical bucket
86334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    //       from its current UID/PID to UID/? (races and
86434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    //       wrap around are our achilles heel). Below is
86534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    //       merely lipservice to catch PIDs that were still
86634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    //       around when the stats were pruned to zero.
86734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    gone_szs += szsTotal;
86834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    gone_els += elsTotal;
86934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    continue;
87034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                }
87134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
872e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                if (!first && (spaces > 0)) {
87334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    string.appendFormat("%*s", spaces, "");
87434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                }
87534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                spaces = 0;
87634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
8778e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                intermediate = string.format(gone ? "%d/%d?" : "%d/%d", u, p);
8788e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                string.appendFormat(first ? "\n%-12s" : "%-12s",
87934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                                    intermediate.string());
88034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                intermediate.clear();
88134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
88234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                oldLength = string.length();
88334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                string.appendFormat("%zu/%zu", szsTotal, elsTotal);
88434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                spaces += spaces_total + oldLength - string.length();
88534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
88634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                if (els == elsTotal) {
887e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                    if (spaces < 0) {
888e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                        spaces = 0;
889e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                    }
89034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    string.appendFormat("%*s=", spaces, "");
89134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    spaces = -1;
89234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                } else if (els) {
89334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    oldLength = string.length();
894e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                    if (spaces < 0) {
895e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                        spaces = 0;
896e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                    }
89734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    string.appendFormat("%*s%zu/%zu", spaces, "",
89834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                                        pp->sizes(), els);
89934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    spaces -= string.length() - oldLength;
90034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                }
90134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                spaces += spaces_current;
90234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
90334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                first = !first;
90434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            }
90534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
90634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            if (gone_els) {
907e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn                if (!first && (spaces > 0)) {
90834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                    string.appendFormat("%*s", spaces, "");
90934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                }
91034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
91134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                intermediate = string.format("%d/?", u);
9128e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn                string.appendFormat(first ? "\n%-12s" : "%-12s",
91334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                                    intermediate.string());
91434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                intermediate.clear();
91534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
91634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                spaces = spaces_total + spaces_current;
91734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
91834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                oldLength = string.length();
91934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                string.appendFormat("%zu/%zu", gone_szs, gone_els);
92034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                spaces -= string.length() - oldLength;
92134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
92234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn                first = !first;
92334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn            }
92434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn        }
92534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    }
92634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
927dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn    *buf = strdup(string.string());
92834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}
9294ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn
9304ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzynuid_t LogStatistics::pidToUid(pid_t pid) {
9314ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn    log_id_for_each(i) {
9324ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn        LidStatistics &l = id(i);
9334ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn        UidStatisticsCollection::iterator iu;
9344ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn        for (iu = l.begin(); iu != l.end(); ++iu) {
9354ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn            UidStatistics &u = *(*iu);
9364ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn            PidStatisticsCollection::iterator ip;
9374ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn            for (ip = u.begin(); ip != u.end(); ++ip) {
9384ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn                if ((*ip)->getPid() == pid) {
9394ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn                    return u.getUid();
9404ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn                }
9414ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn            }
9424ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn        }
9434ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn    }
9444ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn    return getuid(); // associate this with the logger
9454ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn}
946