LogStatistics.cpp revision 239605ef64d34ced82c97870e3f3f5c4145be58c
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 } 278e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn 279e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn dgram_qlen_statistics = false; 280e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn for(unsigned short bucket = 0; dgram_qlen(bucket); ++bucket) { 281e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn mMinimum[bucket].tv_sec = (uint32_t)-1; 282e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn mMinimum[bucket].tv_nsec = 999999999UL; 283e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 284e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn} 285e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn 286e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// Each bucket below represents a dgram_qlen of log messages. By 287e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// finding the minimum period of time from start to finish 288e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// of each dgram_qlen, we can get a performance expectation for 289e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// the user space logger. The net result is that the period 290e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// of time divided by the dgram_qlen will give us the average time 291e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// between log messages; at the point where the average time 292e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// is greater than the throughput capability of the logger 293e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// we will not longer require the benefits of the FIFO formed 294e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// by max_dgram_qlen. We will also expect to see a very visible 295e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// knee in the average time between log messages at this point, 296e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// so we do not necessarily have to compare the rate against the 297e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// measured performance (BM_log_maximum_retry) of the logger. 298e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// 299e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// for example (reformatted): 300e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// 301e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// Minimum time between log events per dgram_qlen: 302e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// 1 2 3 5 10 20 30 50 100 200 300 400 500 600 303e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// 5u2 12u 13u 15u 16u 27u 30u 36u 407u 3m1 3m3 3m9 3m9 5m5 304e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// 305e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// demonstrates a clear knee rising at 100, so this means that for this 306e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// case max_dgram_qlen = 100 would be more than sufficient to handle the 307e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// worst that the system could stuff into the logger. The 308e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// BM_log_maximum_retry performance (derated by the log collection) on the 309e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// same system was 33.2us so we would almost be fine with max_dgram_qlen = 50. 310e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// BM_log_maxumum_retry with statistics off is roughly 20us, so 311e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// max_dgram_qlen = 20 would work. We will be more than willing to have 312e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// a large engineering margin so the rule of thumb that lead us to 100 is 313e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// fine. 314e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// 315e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// bucket dgram_qlen are tuned for /proc/sys/net/unix/max_dgram_qlen = 300 316e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzynconst unsigned short LogStatistics::mBuckets[] = { 317e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn 1, 2, 3, 5, 10, 20, 30, 50, 100, 200, 300, 400, 500, 600 318e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn}; 319e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn 320e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzynunsigned short LogStatistics::dgram_qlen(unsigned short bucket) { 321e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn if (bucket >= sizeof(mBuckets) / sizeof(mBuckets[0])) { 322e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn return 0; 323e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 324e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn return mBuckets[bucket]; 325e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn} 326e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn 327e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzynunsigned long long LogStatistics::minimum(unsigned short bucket) { 328e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn if (mMinimum[bucket].tv_sec == LONG_MAX) { 329e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn return 0; 330e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 331e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn return mMinimum[bucket].nsec(); 332e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn} 333e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn 334e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzynvoid LogStatistics::recordDiff(log_time diff, unsigned short bucket) { 335e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn if ((diff.tv_sec || diff.tv_nsec) && (mMinimum[bucket] > diff)) { 336e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn mMinimum[bucket] = diff; 337e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 33834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn} 33934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 34034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynvoid LogStatistics::add(unsigned short size, 34134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn log_id_t log_id, uid_t uid, pid_t pid) { 34234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn mSizes[log_id] += size; 34334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn ++mElements[log_id]; 34434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn id(log_id).add(size, uid, pid); 34534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn} 34634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 34734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynvoid LogStatistics::subtract(unsigned short size, 34834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn log_id_t log_id, uid_t uid, pid_t pid) { 34934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn mSizes[log_id] -= size; 35034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn --mElements[log_id]; 35134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn id(log_id).subtract(size, uid, pid); 35234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn} 35334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 35434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t LogStatistics::sizes(log_id_t log_id, uid_t uid, pid_t pid) { 35534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (log_id != log_id_all) { 35634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn return id(log_id).sizes(uid, pid); 35734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 35834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn size_t sizes = 0; 35934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn log_id_for_each(i) { 36034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn sizes += id(i).sizes(uid, pid); 36134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 36234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn return sizes; 36334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn} 36434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 36534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t LogStatistics::elements(log_id_t log_id, uid_t uid, pid_t pid) { 36634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (log_id != log_id_all) { 36734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn return id(log_id).elements(uid, pid); 36834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 36934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn size_t elements = 0; 37034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn log_id_for_each(i) { 37134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn elements += id(i).elements(uid, pid); 37234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 37334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn return elements; 37434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn} 37534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 37634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t LogStatistics::sizesTotal(log_id_t log_id, uid_t uid, pid_t pid) { 37734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (log_id != log_id_all) { 37834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn return id(log_id).sizesTotal(uid, pid); 37934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 38034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn size_t sizes = 0; 38134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn log_id_for_each(i) { 38234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn sizes += id(i).sizesTotal(uid, pid); 38334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 38434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn return sizes; 38534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn} 38634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 38734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t LogStatistics::elementsTotal(log_id_t log_id, uid_t uid, pid_t pid) { 38834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (log_id != log_id_all) { 38934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn return id(log_id).elementsTotal(uid, pid); 39034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 39134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn size_t elements = 0; 39234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn log_id_for_each(i) { 39334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn elements += id(i).elementsTotal(uid, pid); 39434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 39534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn return elements; 39634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn} 39734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 398dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzynvoid LogStatistics::format(char **buf, 399dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn uid_t uid, unsigned int logMask, log_time oldest) { 40034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn const unsigned short spaces_current = 13; 40134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn const unsigned short spaces_total = 19; 40234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 40334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (*buf) { 404239605ef64d34ced82c97870e3f3f5c4145be58cGreg Hackmann free(*buf); 40534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn *buf = NULL; 40634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 40734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 40834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn android::String8 string(" span -> size/num"); 40934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn size_t oldLength; 41034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn short spaces = 2; 41134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 41234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn log_id_for_each(i) { 41334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (logMask & (1 << i)) { 41434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn oldLength = string.length(); 415e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn if (spaces < 0) { 416e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn spaces = 0; 417e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 41834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn string.appendFormat("%*s%s", spaces, "", android_log_id_to_name(i)); 41934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces += spaces_total + oldLength - string.length(); 42034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 42134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 42234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 42334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces = 1; 42434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn log_time t(CLOCK_MONOTONIC); 42534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn unsigned long long d = t.nsec() - start.nsec(); 42634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn string.appendFormat("\nTotal%4llu:%02llu:%02llu.%09llu", 42734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn d / NS_PER_SEC / 60 / 60, (d / NS_PER_SEC / 60) % 60, 42834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn (d / NS_PER_SEC) % 60, d % NS_PER_SEC); 42934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 43034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn log_id_for_each(i) { 43134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (!(logMask & (1 << i))) { 43234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn continue; 43334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 43434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn oldLength = string.length(); 435e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn if (spaces < 0) { 436e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn spaces = 0; 437e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 43834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn string.appendFormat("%*s%zu/%zu", spaces, "", 43934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn sizesTotal(i), elementsTotal(i)); 44034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces += spaces_total + oldLength - string.length(); 44134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 44234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 44334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces = 1; 44434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn d = t.nsec() - oldest.nsec(); 44534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn string.appendFormat("\nNow%6llu:%02llu:%02llu.%09llu", 44634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn d / NS_PER_SEC / 60 / 60, (d / NS_PER_SEC / 60) % 60, 44734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn (d / NS_PER_SEC) % 60, d % NS_PER_SEC); 44834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 44934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn log_id_for_each(i) { 45034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (!(logMask & (1 << i))) { 45134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn continue; 45234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 45334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 45434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn size_t els = elements(i); 45534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (els) { 45634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn oldLength = string.length(); 457e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn if (spaces < 0) { 458e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn spaces = 0; 459e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 46034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn string.appendFormat("%*s%zu/%zu", spaces, "", sizes(i), els); 46134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces -= string.length() - oldLength; 46234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 46334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces += spaces_total; 46434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 46534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 466e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn if (dgram_qlen_statistics) { 467e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn const unsigned short spaces_time = 6; 468e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn const unsigned long long max_seconds = 100000; 469e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn spaces = 0; 470e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn string.append("\n\nMinimum time between log events per dgram_qlen:\n"); 471e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn for(unsigned short i = 0; dgram_qlen(i); ++i) { 472e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn oldLength = string.length(); 473e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn if (spaces < 0) { 474e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn spaces = 0; 475e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 476e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn string.appendFormat("%*s%u", spaces, "", dgram_qlen(i)); 477e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn spaces += spaces_time + oldLength - string.length(); 478e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 479e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn string.append("\n"); 480e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn spaces = 0; 481e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn unsigned short n; 482e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn for(unsigned short i = 0; (n = dgram_qlen(i)); ++i) { 483e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn unsigned long long duration = minimum(i); 484e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn if (duration) { 485e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn duration /= n; 486e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn if (duration >= (NS_PER_SEC * max_seconds)) { 487e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn duration = NS_PER_SEC * (max_seconds - 1); 488e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 489e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn oldLength = string.length(); 490e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn if (spaces < 0) { 491e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn spaces = 0; 492e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 493e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn string.appendFormat("%*s", spaces, ""); 494e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn if (duration >= (NS_PER_SEC * 10)) { 495e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn string.appendFormat("%llu", 496e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn (duration + (NS_PER_SEC / 2)) 497e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn / NS_PER_SEC); 498e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } else if (duration >= (NS_PER_SEC / (1000 / 10))) { 499e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn string.appendFormat("%llum", 500e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn (duration + (NS_PER_SEC / 2 / 1000)) 501e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn / (NS_PER_SEC / 1000)); 502e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } else if (duration >= (NS_PER_SEC / (1000000 / 10))) { 503e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn string.appendFormat("%lluu", 504e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn (duration + (NS_PER_SEC / 2 / 1000000)) 505e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn / (NS_PER_SEC / 1000000)); 506e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } else { 507e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn string.appendFormat("%llun", duration); 508e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 509e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn spaces -= string.length() - oldLength; 510e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 511e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn spaces += spaces_time; 512e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 513e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 514e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn 51534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn log_id_for_each(i) { 51634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (!(logMask & (1 << i))) { 51734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn continue; 51834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 51934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 52034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn bool header = false; 52134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn bool first = true; 52234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 52334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn UidStatisticsCollection::iterator ut; 52434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn for(ut = id(i).begin(); ut != id(i).end(); ++ut) { 52534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn UidStatistics *up = *ut; 52634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if ((uid != AID_ROOT) && (uid != up->getUid())) { 52734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn continue; 52834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 52934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 53034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn PidStatisticsCollection::iterator pt = up->begin(); 53134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (pt == up->end()) { 53234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn continue; 53334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 53434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 53534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn android::String8 intermediate; 53634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 53734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (!header) { 53834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn // header below tuned to match spaces_total and spaces_current 53934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces = 0; 54034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn intermediate = string.format("%s: UID/PID Total size/num", 54134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn android_log_id_to_name(i)); 54234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn string.appendFormat("\n\n%-31sNow " 54334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn "UID/PID[?] Total Now", 54434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn intermediate.string()); 54534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn intermediate.clear(); 54634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn header = true; 54734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 54834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 54934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn bool oneline = ++pt == up->end(); 55034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn --pt; 55134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 55234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (!oneline) { 55334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn first = true; 554e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } else if (!first && (spaces > 0)) { 55534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn string.appendFormat("%*s", spaces, ""); 55634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 55734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces = 0; 55834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 55934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn uid_t u = up->getUid(); 56034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn pid_t p = (*pt)->getPid(); 56134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 56234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn intermediate = string.format(oneline 56334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn ? ((p == PidStatistics::gone) 56434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn ? "%d/?" 56534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn : "%d/%d") 56634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn : "%d", 56734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn u, p); 56834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn string.appendFormat((first) ? "\n%-12s" : "%-12s", 56934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn intermediate.string()); 57034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn intermediate.clear(); 57134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 57234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn size_t elsTotal = up->elementsTotal(); 57334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn oldLength = string.length(); 57434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn string.appendFormat("%zu/%zu", up->sizesTotal(), elsTotal); 57534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces += spaces_total + oldLength - string.length(); 57634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 57734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn size_t els = up->elements(); 57834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (els == elsTotal) { 579e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn if (spaces < 0) { 580e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn spaces = 0; 581e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 58234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn string.appendFormat("%*s=", spaces, ""); 58334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces = -1; 58434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } else if (els) { 58534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn oldLength = string.length(); 586e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn if (spaces < 0) { 587e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn spaces = 0; 588e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 58934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn string.appendFormat("%*s%zu/%zu", spaces, "", up->sizes(), els); 59034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces -= string.length() - oldLength; 59134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 59234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces += spaces_current; 59334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 59434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn first = !first; 59534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 59634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (oneline) { 59734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn continue; 59834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 59934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 60034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn size_t gone_szs = 0; 60134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn size_t gone_els = 0; 60234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 60334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn for(; pt != up->end(); ++pt) { 60434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn PidStatistics *pp = *pt; 60534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn pid_t p = pp->getPid(); 60634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 60734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn // If a PID no longer has any current logs, and is not 60834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn // active anymore, skip & report totals for gone. 60934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn elsTotal = pp->elementsTotal(); 61034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn size_t szsTotal = pp->sizesTotal(); 61134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (p == pp->gone) { 61234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn gone_szs += szsTotal; 61334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn gone_els += elsTotal; 61434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn continue; 61534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 61634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn els = pp->elements(); 61734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn bool gone = kill(p, 0); 61834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (gone && (els == 0)) { 61934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn // ToDo: garbage collection: move this statistical bucket 62034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn // from its current UID/PID to UID/? (races and 62134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn // wrap around are our achilles heel). Below is 62234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn // merely lipservice to catch PIDs that were still 62334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn // around when the stats were pruned to zero. 62434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn gone_szs += szsTotal; 62534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn gone_els += elsTotal; 62634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn continue; 62734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 62834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 629e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn if (!first && (spaces > 0)) { 63034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn string.appendFormat("%*s", spaces, ""); 63134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 63234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces = 0; 63334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 63434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn intermediate = string.format((gone) ? "%d/%d?" : "%d/%d", u, p); 63534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn string.appendFormat((first) ? "\n%-12s" : "%-12s", 63634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn intermediate.string()); 63734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn intermediate.clear(); 63834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 63934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn oldLength = string.length(); 64034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn string.appendFormat("%zu/%zu", szsTotal, elsTotal); 64134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces += spaces_total + oldLength - string.length(); 64234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 64334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (els == elsTotal) { 644e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn if (spaces < 0) { 645e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn spaces = 0; 646e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 64734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn string.appendFormat("%*s=", spaces, ""); 64834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces = -1; 64934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } else if (els) { 65034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn oldLength = string.length(); 651e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn if (spaces < 0) { 652e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn spaces = 0; 653e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 65434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn string.appendFormat("%*s%zu/%zu", spaces, "", 65534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn pp->sizes(), els); 65634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces -= string.length() - oldLength; 65734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 65834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces += spaces_current; 65934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 66034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn first = !first; 66134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 66234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 66334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (gone_els) { 664e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn if (!first && (spaces > 0)) { 66534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn string.appendFormat("%*s", spaces, ""); 66634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 66734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 66834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn intermediate = string.format("%d/?", u); 66934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn string.appendFormat((first) ? "\n%-12s" : "%-12s", 67034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn intermediate.string()); 67134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn intermediate.clear(); 67234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 67334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces = spaces_total + spaces_current; 67434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 67534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn oldLength = string.length(); 67634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn string.appendFormat("%zu/%zu", gone_szs, gone_els); 67734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces -= string.length() - oldLength; 67834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 67934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn first = !first; 68034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 68134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 68234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 68334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 684dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn *buf = strdup(string.string()); 68534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn} 686