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