LogStatistics.cpp revision 3cb54987857690fa5b73f0192cc052eb55b562f7
134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn/* 234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * Copyright (C) 2014 The Android Open Source Project 334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * 434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * Licensed under the Apache License, Version 2.0 (the "License"); 534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * you may not use this file except in compliance with the License. 634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * You may obtain a copy of the License at 734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * 834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * http://www.apache.org/licenses/LICENSE-2.0 934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * 1034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * Unless required by applicable law or agreed to in writing, software 1134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * distributed under the License is distributed on an "AS IS" BASIS, 1234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * See the License for the specific language governing permissions and 1434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * limitations under the License. 1534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn */ 1634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 179a03863e88da99ba010342c874252089dd771f7fMark Salyzyn#include <fcntl.h> 1834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#include <stdarg.h> 1934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#include <time.h> 2034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 2134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#include <log/logger.h> 2234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#include <private/android_filesystem_config.h> 2334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#include <utils/String8.h> 2434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 2534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#include "LogStatistics.h" 2634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 279a03863e88da99ba010342c874252089dd771f7fMark SalyzynPidStatistics::PidStatistics(pid_t pid, char *name) 2834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn : pid(pid) 2934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn , mSizesTotal(0) 3034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn , mElementsTotal(0) 3134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn , mSizes(0) 329a03863e88da99ba010342c874252089dd771f7fMark Salyzyn , mElements(0) 339a03863e88da99ba010342c874252089dd771f7fMark Salyzyn , name(name) 34fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn , mGone(false) 359a03863e88da99ba010342c874252089dd771f7fMark Salyzyn{ } 369a03863e88da99ba010342c874252089dd771f7fMark Salyzyn 379a03863e88da99ba010342c874252089dd771f7fMark Salyzyn#ifdef DO_NOT_ERROR_IF_PIDSTATISTICS_USES_A_COPY_CONSTRUCTOR 389a03863e88da99ba010342c874252089dd771f7fMark SalyzynPidStatistics::PidStatistics(const PidStatistics ©) 399a03863e88da99ba010342c874252089dd771f7fMark Salyzyn : pid(copy->pid) 409a03863e88da99ba010342c874252089dd771f7fMark Salyzyn , name(copy->name ? strdup(copy->name) : NULL) 419a03863e88da99ba010342c874252089dd771f7fMark Salyzyn , mSizesTotal(copy->mSizesTotal) 429a03863e88da99ba010342c874252089dd771f7fMark Salyzyn , mElementsTotal(copy->mElementsTotal) 439a03863e88da99ba010342c874252089dd771f7fMark Salyzyn , mSizes(copy->mSizes) 449a03863e88da99ba010342c874252089dd771f7fMark Salyzyn , mElements(copy->mElements) 45fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn , mGone(copy->mGone) 469a03863e88da99ba010342c874252089dd771f7fMark Salyzyn{ } 479a03863e88da99ba010342c874252089dd771f7fMark Salyzyn#endif 489a03863e88da99ba010342c874252089dd771f7fMark Salyzyn 499a03863e88da99ba010342c874252089dd771f7fMark SalyzynPidStatistics::~PidStatistics() { 509a03863e88da99ba010342c874252089dd771f7fMark Salyzyn free(name); 519a03863e88da99ba010342c874252089dd771f7fMark Salyzyn} 529a03863e88da99ba010342c874252089dd771f7fMark Salyzyn 53fdabe7287609af29793bb6ca15712582ba082521Mark Salyzynbool PidStatistics::pidGone() { 54fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn if (mGone) { 55fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn return true; 56fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn } 57fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn if (pid == gone) { 58fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn return true; 59fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn } 60fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn if (kill(pid, 0) && (errno != EPERM)) { 61fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn mGone = true; 62fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn return true; 63fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn } 64fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn return false; 65fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn} 66fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn 679a03863e88da99ba010342c874252089dd771f7fMark Salyzynvoid PidStatistics::setName(char *new_name) { 689a03863e88da99ba010342c874252089dd771f7fMark Salyzyn free(name); 699a03863e88da99ba010342c874252089dd771f7fMark Salyzyn name = new_name; 709a03863e88da99ba010342c874252089dd771f7fMark Salyzyn} 7134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 7234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynvoid PidStatistics::add(unsigned short size) { 7334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn mSizesTotal += size; 7434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn ++mElementsTotal; 7534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn mSizes += size; 7634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn ++mElements; 7734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn} 7834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 7934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynbool PidStatistics::subtract(unsigned short size) { 8034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn mSizes -= size; 8134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn --mElements; 82fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn return (mElements == 0) && pidGone(); 8334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn} 8434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 8534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynvoid PidStatistics::addTotal(size_t size, size_t element) { 8634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (pid == gone) { 8734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn mSizesTotal += size; 8834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn mElementsTotal += element; 8934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 9034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn} 9134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 929a03863e88da99ba010342c874252089dd771f7fMark Salyzyn// must call free to release return value 939a03863e88da99ba010342c874252089dd771f7fMark Salyzynchar *PidStatistics::pidToName(pid_t pid) { 949a03863e88da99ba010342c874252089dd771f7fMark Salyzyn char *retval = NULL; 95fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn if (pid != gone) { 969a03863e88da99ba010342c874252089dd771f7fMark Salyzyn char buffer[512]; 979a03863e88da99ba010342c874252089dd771f7fMark Salyzyn snprintf(buffer, sizeof(buffer), "/proc/%u/cmdline", pid); 989a03863e88da99ba010342c874252089dd771f7fMark Salyzyn int fd = open(buffer, O_RDONLY); 999a03863e88da99ba010342c874252089dd771f7fMark Salyzyn if (fd >= 0) { 1009a03863e88da99ba010342c874252089dd771f7fMark Salyzyn ssize_t ret = read(fd, buffer, sizeof(buffer)); 1019a03863e88da99ba010342c874252089dd771f7fMark Salyzyn if (ret > 0) { 1029a03863e88da99ba010342c874252089dd771f7fMark Salyzyn buffer[sizeof(buffer)-1] = '\0'; 1039a03863e88da99ba010342c874252089dd771f7fMark Salyzyn // frameworks intermediate state 1049a03863e88da99ba010342c874252089dd771f7fMark Salyzyn if (strcmp(buffer, "<pre-initialized>")) { 1059a03863e88da99ba010342c874252089dd771f7fMark Salyzyn retval = strdup(buffer); 1069a03863e88da99ba010342c874252089dd771f7fMark Salyzyn } 1079a03863e88da99ba010342c874252089dd771f7fMark Salyzyn } 1089a03863e88da99ba010342c874252089dd771f7fMark Salyzyn close(fd); 1099a03863e88da99ba010342c874252089dd771f7fMark Salyzyn } 1109a03863e88da99ba010342c874252089dd771f7fMark Salyzyn } 1119a03863e88da99ba010342c874252089dd771f7fMark Salyzyn return retval; 1129a03863e88da99ba010342c874252089dd771f7fMark Salyzyn} 1139a03863e88da99ba010342c874252089dd771f7fMark Salyzyn 11434facab86b0fe7ec613de92b46b637f864fb0682Mark SalyzynUidStatistics::UidStatistics(uid_t uid) 115c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn : uid(uid) 116c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn , mSizes(0) 117c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn , mElements(0) { 11834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn Pids.clear(); 11934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn} 12034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 12134facab86b0fe7ec613de92b46b637f864fb0682Mark SalyzynUidStatistics::~UidStatistics() { 12234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn PidStatisticsCollection::iterator it; 12334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn for (it = begin(); it != end();) { 12434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn delete (*it); 12534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn it = Pids.erase(it); 12634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 12734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn} 12834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 12934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynvoid UidStatistics::add(unsigned short size, pid_t pid) { 130c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn mSizes += size; 131c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn ++mElements; 132c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn 13334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn PidStatistics *p; 13434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn PidStatisticsCollection::iterator last; 13534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn PidStatisticsCollection::iterator it; 13634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn for (last = it = begin(); it != end(); last = it, ++it) { 13734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn p = *it; 13834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (pid == p->getPid()) { 13934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn p->add(size); 14034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn return; 14134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 14234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 143c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn // insert if the gone entry. 144c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn bool insert = (last != it) && (p->getPid() == p->gone); 1459a03863e88da99ba010342c874252089dd771f7fMark Salyzyn p = new PidStatistics(pid, pidToName(pid)); 14634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (insert) { 14734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn Pids.insert(last, p); 14834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } else { 14934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn Pids.push_back(p); 15034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 15134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn p->add(size); 15234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn} 15334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 15434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynvoid UidStatistics::subtract(unsigned short size, pid_t pid) { 155c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn mSizes -= size; 156c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn --mElements; 157c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn 15834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn PidStatisticsCollection::iterator it; 15934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn for (it = begin(); it != end(); ++it) { 16034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn PidStatistics *p = *it; 16134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (pid == p->getPid()) { 16234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (p->subtract(size)) { 16334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn size_t szsTotal = p->sizesTotal(); 16434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn size_t elsTotal = p->elementsTotal(); 16534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn delete p; 16634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn Pids.erase(it); 16734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn it = end(); 16834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn --it; 16934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (it == end()) { 17034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn p = new PidStatistics(p->gone); 17134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn Pids.push_back(p); 17234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } else { 17334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn p = *it; 17434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (p->getPid() != p->gone) { 17534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn p = new PidStatistics(p->gone); 17634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn Pids.push_back(p); 17734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 17834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 17934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn p->addTotal(szsTotal, elsTotal); 18034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 18134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn return; 18234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 18334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 18434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn} 18534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 186c8a576c637ae00577273b778498019dd609fcd15Mark Salyzynvoid UidStatistics::sort() { 187c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn for (bool pass = true; pass;) { 188c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn pass = false; 189c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn PidStatisticsCollection::iterator it = begin(); 190c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn if (it != end()) { 191c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn PidStatisticsCollection::iterator lt = it; 192c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn PidStatistics *l = (*lt); 193c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn while (++it != end()) { 194c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn PidStatistics *n = (*it); 195c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn if ((n->getPid() != n->gone) && (n->sizes() > l->sizes())) { 196c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn pass = true; 197c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn Pids.erase(it); 198c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn Pids.insert(lt, n); 199c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn it = lt; 200c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn n = l; 201c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn } 202c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn lt = it; 203c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn l = n; 204c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn } 205c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn } 206c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn } 207c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn} 208c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn 20934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t UidStatistics::sizes(pid_t pid) { 210c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn if (pid == pid_all) { 211c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn return sizes(); 212c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn } 213c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn 21434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn PidStatisticsCollection::iterator it; 21534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn for (it = begin(); it != end(); ++it) { 21634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn PidStatistics *p = *it; 217c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn if (pid == p->getPid()) { 218c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn return p->sizes(); 21934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 22034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 221c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn return 0; 22234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn} 22334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 22434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t UidStatistics::elements(pid_t pid) { 225c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn if (pid == pid_all) { 226c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn return elements(); 227c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn } 228c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn 22934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn PidStatisticsCollection::iterator it; 23034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn for (it = begin(); it != end(); ++it) { 23134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn PidStatistics *p = *it; 232c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn if (pid == p->getPid()) { 233c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn return p->elements(); 23434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 23534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 236c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn return 0; 23734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn} 23834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 23934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t UidStatistics::sizesTotal(pid_t pid) { 24034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn size_t sizes = 0; 24134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn PidStatisticsCollection::iterator it; 24234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn for (it = begin(); it != end(); ++it) { 24334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn PidStatistics *p = *it; 24434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if ((pid == pid_all) || (pid == p->getPid())) { 24534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn sizes += p->sizesTotal(); 24634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 24734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 24834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn return sizes; 24934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn} 25034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 25134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t UidStatistics::elementsTotal(pid_t pid) { 25234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn size_t elements = 0; 25334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn PidStatisticsCollection::iterator it; 25434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn for (it = begin(); it != end(); ++it) { 25534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn PidStatistics *p = *it; 25634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if ((pid == pid_all) || (pid == p->getPid())) { 25734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn elements += p->elementsTotal(); 25834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 25934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 26034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn return elements; 26134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn} 26234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 26334facab86b0fe7ec613de92b46b637f864fb0682Mark SalyzynLidStatistics::LidStatistics() { 26434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn Uids.clear(); 26534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn} 26634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 26734facab86b0fe7ec613de92b46b637f864fb0682Mark SalyzynLidStatistics::~LidStatistics() { 26834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn UidStatisticsCollection::iterator it; 26934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn for (it = begin(); it != end();) { 27034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn delete (*it); 27134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn it = Uids.erase(it); 27234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 27334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn} 27434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 27534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynvoid LidStatistics::add(unsigned short size, uid_t uid, pid_t pid) { 27634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn UidStatistics *u; 27734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn UidStatisticsCollection::iterator it; 27834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn UidStatisticsCollection::iterator last; 27934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 28034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (uid == (uid_t) -1) { // init 28134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn uid = (uid_t) AID_ROOT; 28234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 28334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 28434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn for (last = it = begin(); it != end(); last = it, ++it) { 28534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn u = *it; 28634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (uid == u->getUid()) { 28734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn u->add(size, pid); 28834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if ((last != it) && ((*last)->sizesTotal() < u->sizesTotal())) { 28934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn Uids.erase(it); 29034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn Uids.insert(last, u); 29134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 29234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn return; 29334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 29434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 29534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn u = new UidStatistics(uid); 29634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if ((last != it) && ((*last)->sizesTotal() < (size_t) size)) { 29734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn Uids.insert(last, u); 29834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } else { 29934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn Uids.push_back(u); 30034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 30134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn u->add(size, pid); 30234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn} 30334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 30434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynvoid LidStatistics::subtract(unsigned short size, uid_t uid, pid_t pid) { 30534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn UidStatisticsCollection::iterator it; 30634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn for (it = begin(); it != end(); ++it) { 30734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn UidStatistics *u = *it; 30834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (uid == u->getUid()) { 30934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn u->subtract(size, pid); 31034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn return; 31134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 31234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 31334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn} 31434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 315c8a576c637ae00577273b778498019dd609fcd15Mark Salyzynvoid LidStatistics::sort() { 316c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn for (bool pass = true; pass;) { 317c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn pass = false; 318c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn UidStatisticsCollection::iterator it = begin(); 319c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn if (it != end()) { 320c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn UidStatisticsCollection::iterator lt = it; 321c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn UidStatistics *l = (*lt); 322c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn while (++it != end()) { 323c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn UidStatistics *n = (*it); 324c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn if (n->sizes() > l->sizes()) { 325c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn pass = true; 326c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn Uids.erase(it); 327c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn Uids.insert(lt, n); 328c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn it = lt; 329c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn n = l; 330c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn } 331c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn lt = it; 332c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn l = n; 333c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn } 334c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn } 335c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn } 336c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn} 337c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn 33834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t LidStatistics::sizes(uid_t uid, pid_t pid) { 33934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn size_t sizes = 0; 34034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn UidStatisticsCollection::iterator it; 34134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn for (it = begin(); it != end(); ++it) { 34234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn UidStatistics *u = *it; 34334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if ((uid == uid_all) || (uid == u->getUid())) { 34434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn sizes += u->sizes(pid); 34534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 34634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 34734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn return sizes; 34834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn} 34934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 35034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t LidStatistics::elements(uid_t uid, pid_t pid) { 35134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn size_t elements = 0; 35234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn UidStatisticsCollection::iterator it; 35334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn for (it = begin(); it != end(); ++it) { 35434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn UidStatistics *u = *it; 35534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if ((uid == uid_all) || (uid == u->getUid())) { 35634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn elements += u->elements(pid); 35734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 35834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 35934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn return elements; 36034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn} 36134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 36234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t LidStatistics::sizesTotal(uid_t uid, pid_t pid) { 36334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn size_t sizes = 0; 36434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn UidStatisticsCollection::iterator it; 36534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn for (it = begin(); it != end(); ++it) { 36634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn UidStatistics *u = *it; 36734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if ((uid == uid_all) || (uid == u->getUid())) { 36834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn sizes += u->sizesTotal(pid); 36934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 37034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 37134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn return sizes; 37234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn} 37334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 37434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t LidStatistics::elementsTotal(uid_t uid, pid_t pid) { 37534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn size_t elements = 0; 37634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn UidStatisticsCollection::iterator it; 37734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn for (it = begin(); it != end(); ++it) { 37834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn UidStatistics *u = *it; 37934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if ((uid == uid_all) || (uid == u->getUid())) { 38034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn elements += u->elementsTotal(pid); 38134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 38234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 38334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn return elements; 38434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn} 38534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 38634facab86b0fe7ec613de92b46b637f864fb0682Mark SalyzynLogStatistics::LogStatistics() 38734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn : start(CLOCK_MONOTONIC) { 38834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn log_id_for_each(i) { 38934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn mSizes[i] = 0; 39034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn mElements[i] = 0; 39134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 392e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn 393e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn dgram_qlen_statistics = false; 394e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn for(unsigned short bucket = 0; dgram_qlen(bucket); ++bucket) { 3953cb54987857690fa5b73f0192cc052eb55b562f7Mark Salyzyn mMinimum[bucket].tv_sec = mMinimum[bucket].tv_sec_max; 3963cb54987857690fa5b73f0192cc052eb55b562f7Mark Salyzyn mMinimum[bucket].tv_nsec = mMinimum[bucket].tv_nsec_max; 397e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 398e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn} 399e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn 400e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// Each bucket below represents a dgram_qlen of log messages. By 401e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// finding the minimum period of time from start to finish 402e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// of each dgram_qlen, we can get a performance expectation for 403e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// the user space logger. The net result is that the period 404e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// of time divided by the dgram_qlen will give us the average time 405e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// between log messages; at the point where the average time 406e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// is greater than the throughput capability of the logger 407e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// we will not longer require the benefits of the FIFO formed 408e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// by max_dgram_qlen. We will also expect to see a very visible 409e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// knee in the average time between log messages at this point, 410e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// so we do not necessarily have to compare the rate against the 411e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// measured performance (BM_log_maximum_retry) of the logger. 412e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// 413e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// for example (reformatted): 414e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// 415e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// Minimum time between log events per dgram_qlen: 416e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// 1 2 3 5 10 20 30 50 100 200 300 400 500 600 417e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// 5u2 12u 13u 15u 16u 27u 30u 36u 407u 3m1 3m3 3m9 3m9 5m5 418e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// 419e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// demonstrates a clear knee rising at 100, so this means that for this 420e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// case max_dgram_qlen = 100 would be more than sufficient to handle the 421e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// worst that the system could stuff into the logger. The 422e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// BM_log_maximum_retry performance (derated by the log collection) on the 423e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// same system was 33.2us so we would almost be fine with max_dgram_qlen = 50. 424e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// BM_log_maxumum_retry with statistics off is roughly 20us, so 425e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// max_dgram_qlen = 20 would work. We will be more than willing to have 426e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// a large engineering margin so the rule of thumb that lead us to 100 is 427e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// fine. 428e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// 429e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn// bucket dgram_qlen are tuned for /proc/sys/net/unix/max_dgram_qlen = 300 430e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzynconst unsigned short LogStatistics::mBuckets[] = { 431e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn 1, 2, 3, 5, 10, 20, 30, 50, 100, 200, 300, 400, 500, 600 432e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn}; 433e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn 434e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzynunsigned short LogStatistics::dgram_qlen(unsigned short bucket) { 435e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn if (bucket >= sizeof(mBuckets) / sizeof(mBuckets[0])) { 436e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn return 0; 437e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 438e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn return mBuckets[bucket]; 439e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn} 440e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn 441e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzynunsigned long long LogStatistics::minimum(unsigned short bucket) { 4423cb54987857690fa5b73f0192cc052eb55b562f7Mark Salyzyn if (mMinimum[bucket].tv_sec == mMinimum[bucket].tv_sec_max) { 443e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn return 0; 444e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 445e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn return mMinimum[bucket].nsec(); 446e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn} 447e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn 448e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzynvoid LogStatistics::recordDiff(log_time diff, unsigned short bucket) { 449e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn if ((diff.tv_sec || diff.tv_nsec) && (mMinimum[bucket] > diff)) { 450e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn mMinimum[bucket] = diff; 451e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 45234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn} 45334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 45434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynvoid LogStatistics::add(unsigned short size, 45534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn log_id_t log_id, uid_t uid, pid_t pid) { 45634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn mSizes[log_id] += size; 45734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn ++mElements[log_id]; 45834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn id(log_id).add(size, uid, pid); 45934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn} 46034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 46134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynvoid LogStatistics::subtract(unsigned short size, 46234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn log_id_t log_id, uid_t uid, pid_t pid) { 46334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn mSizes[log_id] -= size; 46434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn --mElements[log_id]; 46534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn id(log_id).subtract(size, uid, pid); 46634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn} 46734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 46834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t LogStatistics::sizes(log_id_t log_id, uid_t uid, pid_t pid) { 46934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (log_id != log_id_all) { 47034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn return id(log_id).sizes(uid, pid); 47134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 47234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn size_t sizes = 0; 47334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn log_id_for_each(i) { 47434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn sizes += id(i).sizes(uid, pid); 47534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 47634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn return sizes; 47734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn} 47834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 47934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t LogStatistics::elements(log_id_t log_id, uid_t uid, pid_t pid) { 48034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (log_id != log_id_all) { 48134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn return id(log_id).elements(uid, pid); 48234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 48334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn size_t elements = 0; 48434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn log_id_for_each(i) { 48534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn elements += id(i).elements(uid, pid); 48634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 48734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn return elements; 48834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn} 48934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 49034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t LogStatistics::sizesTotal(log_id_t log_id, uid_t uid, pid_t pid) { 49134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (log_id != log_id_all) { 49234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn return id(log_id).sizesTotal(uid, pid); 49334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 49434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn size_t sizes = 0; 49534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn log_id_for_each(i) { 49634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn sizes += id(i).sizesTotal(uid, pid); 49734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 49834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn return sizes; 49934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn} 50034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 50134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynsize_t LogStatistics::elementsTotal(log_id_t log_id, uid_t uid, pid_t pid) { 50234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (log_id != log_id_all) { 50334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn return id(log_id).elementsTotal(uid, pid); 50434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 50534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn size_t elements = 0; 50634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn log_id_for_each(i) { 50734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn elements += id(i).elementsTotal(uid, pid); 50834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 50934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn return elements; 51034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn} 51134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 512dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzynvoid LogStatistics::format(char **buf, 513dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn uid_t uid, unsigned int logMask, log_time oldest) { 5149a03863e88da99ba010342c874252089dd771f7fMark Salyzyn static const unsigned short spaces_current = 13; 5159a03863e88da99ba010342c874252089dd771f7fMark Salyzyn static const unsigned short spaces_total = 19; 51634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 51734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (*buf) { 518239605ef64d34ced82c97870e3f3f5c4145be58cGreg Hackmann free(*buf); 51934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn *buf = NULL; 52034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 52134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 52234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn android::String8 string(" span -> size/num"); 52334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn size_t oldLength; 52434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn short spaces = 2; 52534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 52634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn log_id_for_each(i) { 527c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn if (!logMask & (1 << i)) { 528c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn continue; 529c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn } 530c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn oldLength = string.length(); 531c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn if (spaces < 0) { 532c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn spaces = 0; 533c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn } 534c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn string.appendFormat("%*s%s", spaces, "", android_log_id_to_name(i)); 535c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn spaces += spaces_total + oldLength - string.length(); 536c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn 537c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn LidStatistics &l = id(i); 538c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn l.sort(); 539c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn 540c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn UidStatisticsCollection::iterator iu; 541c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn for (iu = l.begin(); iu != l.end(); ++iu) { 542c8a576c637ae00577273b778498019dd609fcd15Mark Salyzyn (*iu)->sort(); 54334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 54434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 54534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 54634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces = 1; 54734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn log_time t(CLOCK_MONOTONIC); 54834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn unsigned long long d = t.nsec() - start.nsec(); 54934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn string.appendFormat("\nTotal%4llu:%02llu:%02llu.%09llu", 55034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn d / NS_PER_SEC / 60 / 60, (d / NS_PER_SEC / 60) % 60, 55134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn (d / NS_PER_SEC) % 60, d % NS_PER_SEC); 55234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 55334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn log_id_for_each(i) { 55434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (!(logMask & (1 << i))) { 55534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn continue; 55634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 55734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn oldLength = string.length(); 558e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn if (spaces < 0) { 559e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn spaces = 0; 560e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 56134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn string.appendFormat("%*s%zu/%zu", spaces, "", 56234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn sizesTotal(i), elementsTotal(i)); 56334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces += spaces_total + oldLength - string.length(); 56434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 56534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 56634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces = 1; 56734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn d = t.nsec() - oldest.nsec(); 56834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn string.appendFormat("\nNow%6llu:%02llu:%02llu.%09llu", 56934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn d / NS_PER_SEC / 60 / 60, (d / NS_PER_SEC / 60) % 60, 57034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn (d / NS_PER_SEC) % 60, d % NS_PER_SEC); 57134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 57234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn log_id_for_each(i) { 57334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (!(logMask & (1 << i))) { 57434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn continue; 57534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 57634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 57734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn size_t els = elements(i); 57834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (els) { 57934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn oldLength = string.length(); 580e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn if (spaces < 0) { 581e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn spaces = 0; 582e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 58334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn string.appendFormat("%*s%zu/%zu", spaces, "", sizes(i), els); 58434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces -= string.length() - oldLength; 58534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 58634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces += spaces_total; 58734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 58834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 5898e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn // Construct list of worst spammers by Pid 5908e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn static const unsigned char num_spammers = 10; 5918e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn bool header = false; 5928e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn 5938e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn log_id_for_each(i) { 5948e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn if (!(logMask & (1 << i))) { 5958e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn continue; 5968e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn } 5978e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn 5988e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn PidStatisticsCollection pids; 5998e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn pids.clear(); 6008e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn 6018e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn LidStatistics &l = id(i); 6028e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn UidStatisticsCollection::iterator iu; 6038e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn for (iu = l.begin(); iu != l.end(); ++iu) { 6048e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn UidStatistics &u = *(*iu); 6058e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn PidStatisticsCollection::iterator ip; 6068e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn for (ip = u.begin(); ip != u.end(); ++ip) { 6078e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn PidStatistics *p = (*ip); 6088e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn if (p->getPid() == p->gone) { 6098e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn break; 6108e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn } 6118e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn 6128e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn size_t mySizes = p->sizes(); 6138e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn 6148e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn PidStatisticsCollection::iterator q; 6158e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn unsigned char num = 0; 6168e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn for (q = pids.begin(); q != pids.end(); ++q) { 6178e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn if (mySizes > (*q)->sizes()) { 6188e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn pids.insert(q, p); 6198e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn break; 6208e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn } 6218e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn // do we need to traverse deeper in the list? 6228e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn if (++num > num_spammers) { 6238e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn break; 6248e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn } 6258e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn } 6268e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn if (q == pids.end()) { 6278e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn pids.push_back(p); 6288e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn } 6298e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn } 6308e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn } 6318e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn 6328e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn size_t threshold = sizes(i); 6338e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn if (threshold < 65536) { 6348e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn threshold = 65536; 6358e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn } 6368e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn threshold /= 100; 6378e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn 6388e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn PidStatisticsCollection::iterator pt = pids.begin(); 6398e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn 6408e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn for(int line = 0; 6418e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn (pt != pids.end()) && (line < num_spammers); 6428e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn ++line, pt = pids.erase(pt)) { 6438e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn PidStatistics *p = *pt; 6448e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn 6458e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn size_t sizes = p->sizes(); 6468e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn if (sizes < threshold) { 6478e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn break; 6488e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn } 6498e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn 6508e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn char *name = p->getName(); 6518e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn pid_t pid = p->getPid(); 6528e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn if (!name || !*name) { 6538e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn name = pidToName(pid); 6548e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn if (name) { 6558e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn if (*name) { 6568e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn p->setName(name); 6578e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn } else { 6588e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn free(name); 6598e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn name = NULL; 6608e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn } 6618e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn } 6628e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn } 6638e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn 6648e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn if (!header) { 6658e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn string.appendFormat("\n\nChattiest clients:\n" 6668e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn "log id %-*s PID[?] name", 6678e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn spaces_total, "size/total"); 6688e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn header = true; 6698e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn } 6708e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn 6718e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn size_t sizesTotal = p->sizesTotal(); 6728e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn 6738e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn android::String8 sz(""); 6748e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn sz.appendFormat((sizes != sizesTotal) ? "%zu/%zu" : "%zu", 6758e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn sizes, sizesTotal); 6768e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn 6778e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn android::String8 pd(""); 678fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn pd.appendFormat("%u%c", pid, p->pidGone() ? '?' : ' '); 6798e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn 6808e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn string.appendFormat("\n%-7s%-*s %-7s%s", 6818e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn line ? "" : android_log_id_to_name(i), 6828e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn spaces_total, sz.string(), pd.string(), 6838e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn name ? name : ""); 6848e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn } 6858e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn 6868e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn pids.clear(); 6878e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn } 6888e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn 689e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn if (dgram_qlen_statistics) { 690e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn const unsigned short spaces_time = 6; 691e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn const unsigned long long max_seconds = 100000; 692e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn spaces = 0; 693e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn string.append("\n\nMinimum time between log events per dgram_qlen:\n"); 694e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn for(unsigned short i = 0; dgram_qlen(i); ++i) { 695e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn oldLength = string.length(); 696e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn if (spaces < 0) { 697e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn spaces = 0; 698e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 699e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn string.appendFormat("%*s%u", spaces, "", dgram_qlen(i)); 700e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn spaces += spaces_time + oldLength - string.length(); 701e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 702e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn string.append("\n"); 703e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn spaces = 0; 704e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn unsigned short n; 705e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn for(unsigned short i = 0; (n = dgram_qlen(i)); ++i) { 706e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn unsigned long long duration = minimum(i); 707e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn if (duration) { 708e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn duration /= n; 709e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn if (duration >= (NS_PER_SEC * max_seconds)) { 710e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn duration = NS_PER_SEC * (max_seconds - 1); 711e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 712e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn oldLength = string.length(); 713e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn if (spaces < 0) { 714e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn spaces = 0; 715e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 716e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn string.appendFormat("%*s", spaces, ""); 717e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn if (duration >= (NS_PER_SEC * 10)) { 718e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn string.appendFormat("%llu", 719e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn (duration + (NS_PER_SEC / 2)) 720e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn / NS_PER_SEC); 721e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } else if (duration >= (NS_PER_SEC / (1000 / 10))) { 722e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn string.appendFormat("%llum", 723e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn (duration + (NS_PER_SEC / 2 / 1000)) 724e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn / (NS_PER_SEC / 1000)); 725e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } else if (duration >= (NS_PER_SEC / (1000000 / 10))) { 726e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn string.appendFormat("%lluu", 727e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn (duration + (NS_PER_SEC / 2 / 1000000)) 728e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn / (NS_PER_SEC / 1000000)); 729e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } else { 730e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn string.appendFormat("%llun", duration); 731e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 732e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn spaces -= string.length() - oldLength; 733e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 734e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn spaces += spaces_time; 735e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 736e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 737e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn 73834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn log_id_for_each(i) { 73934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (!(logMask & (1 << i))) { 74034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn continue; 74134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 74234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 7438e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn header = false; 74434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn bool first = true; 74534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 74634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn UidStatisticsCollection::iterator ut; 74734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn for(ut = id(i).begin(); ut != id(i).end(); ++ut) { 74834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn UidStatistics *up = *ut; 74934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if ((uid != AID_ROOT) && (uid != up->getUid())) { 75034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn continue; 75134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 75234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 75334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn PidStatisticsCollection::iterator pt = up->begin(); 75434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (pt == up->end()) { 75534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn continue; 75634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 75734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 75834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn android::String8 intermediate; 75934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 76034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (!header) { 76134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn // header below tuned to match spaces_total and spaces_current 76234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces = 0; 76334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn intermediate = string.format("%s: UID/PID Total size/num", 76434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn android_log_id_to_name(i)); 76534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn string.appendFormat("\n\n%-31sNow " 76634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn "UID/PID[?] Total Now", 76734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn intermediate.string()); 76834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn intermediate.clear(); 76934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn header = true; 77034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 77134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 77234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn bool oneline = ++pt == up->end(); 77334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn --pt; 77434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 77534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (!oneline) { 77634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn first = true; 777e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } else if (!first && (spaces > 0)) { 77834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn string.appendFormat("%*s", spaces, ""); 77934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 78034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces = 0; 78134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 78234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn uid_t u = up->getUid(); 783fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn PidStatistics *pp = *pt; 784fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn pid_t p = pp->getPid(); 78534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 78634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn intermediate = string.format(oneline 78734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn ? ((p == PidStatistics::gone) 78834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn ? "%d/?" 789fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn : "%d/%d%c") 79034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn : "%d", 791fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn u, p, pp->pidGone() ? '?' : '\0'); 7928e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn string.appendFormat(first ? "\n%-12s" : "%-12s", 79334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn intermediate.string()); 79434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn intermediate.clear(); 79534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 79634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn size_t elsTotal = up->elementsTotal(); 79734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn oldLength = string.length(); 79834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn string.appendFormat("%zu/%zu", up->sizesTotal(), elsTotal); 79934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces += spaces_total + oldLength - string.length(); 80034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 80134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn size_t els = up->elements(); 80234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (els == elsTotal) { 803e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn if (spaces < 0) { 804e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn spaces = 0; 805e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 80634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn string.appendFormat("%*s=", spaces, ""); 80734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces = -1; 80834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } else if (els) { 80934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn oldLength = string.length(); 810e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn if (spaces < 0) { 811e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn spaces = 0; 812e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 81334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn string.appendFormat("%*s%zu/%zu", spaces, "", up->sizes(), els); 81434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces -= string.length() - oldLength; 81534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 81634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces += spaces_current; 81734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 81834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn first = !first; 81934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 82034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (oneline) { 82134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn continue; 82234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 82334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 82434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn size_t gone_szs = 0; 82534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn size_t gone_els = 0; 82634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 82734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn for(; pt != up->end(); ++pt) { 828fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn pp = *pt; 829fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn p = pp->getPid(); 83034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 83134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn // If a PID no longer has any current logs, and is not 83234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn // active anymore, skip & report totals for gone. 83334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn elsTotal = pp->elementsTotal(); 83434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn size_t szsTotal = pp->sizesTotal(); 83534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (p == pp->gone) { 83634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn gone_szs += szsTotal; 83734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn gone_els += elsTotal; 83834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn continue; 83934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 84034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn els = pp->elements(); 841fdabe7287609af29793bb6ca15712582ba082521Mark Salyzyn bool gone = pp->pidGone(); 84234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (gone && (els == 0)) { 84334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn // ToDo: garbage collection: move this statistical bucket 84434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn // from its current UID/PID to UID/? (races and 84534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn // wrap around are our achilles heel). Below is 84634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn // merely lipservice to catch PIDs that were still 84734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn // around when the stats were pruned to zero. 84834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn gone_szs += szsTotal; 84934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn gone_els += elsTotal; 85034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn continue; 85134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 85234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 853e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn if (!first && (spaces > 0)) { 85434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn string.appendFormat("%*s", spaces, ""); 85534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 85634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces = 0; 85734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 8588e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn intermediate = string.format(gone ? "%d/%d?" : "%d/%d", u, p); 8598e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn string.appendFormat(first ? "\n%-12s" : "%-12s", 86034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn intermediate.string()); 86134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn intermediate.clear(); 86234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 86334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn oldLength = string.length(); 86434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn string.appendFormat("%zu/%zu", szsTotal, elsTotal); 86534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces += spaces_total + oldLength - string.length(); 86634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 86734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (els == elsTotal) { 868e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn if (spaces < 0) { 869e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn spaces = 0; 870e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 87134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn string.appendFormat("%*s=", spaces, ""); 87234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces = -1; 87334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } else if (els) { 87434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn oldLength = string.length(); 875e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn if (spaces < 0) { 876e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn spaces = 0; 877e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn } 87834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn string.appendFormat("%*s%zu/%zu", spaces, "", 87934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn pp->sizes(), els); 88034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces -= string.length() - oldLength; 88134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 88234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces += spaces_current; 88334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 88434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn first = !first; 88534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 88634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 88734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn if (gone_els) { 888e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn if (!first && (spaces > 0)) { 88934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn string.appendFormat("%*s", spaces, ""); 89034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 89134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 89234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn intermediate = string.format("%d/?", u); 8938e72c5384b288bc11af60e12686a44e502633e3dMark Salyzyn string.appendFormat(first ? "\n%-12s" : "%-12s", 89434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn intermediate.string()); 89534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn intermediate.clear(); 89634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 89734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces = spaces_total + spaces_current; 89834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 89934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn oldLength = string.length(); 90034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn string.appendFormat("%zu/%zu", gone_szs, gone_els); 90134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn spaces -= string.length() - oldLength; 90234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 90334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn first = !first; 90434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 90534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 90634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn } 90734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 908dfa7a07f5be656cfafdb4e75916bc9dcd9e592e7Mark Salyzyn *buf = strdup(string.string()); 90934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn} 9104ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn 9114ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzynuid_t LogStatistics::pidToUid(pid_t pid) { 9124ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn log_id_for_each(i) { 9134ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn LidStatistics &l = id(i); 9144ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn UidStatisticsCollection::iterator iu; 9154ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn for (iu = l.begin(); iu != l.end(); ++iu) { 9164ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn UidStatistics &u = *(*iu); 9174ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn PidStatisticsCollection::iterator ip; 9184ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn for (ip = u.begin(); ip != u.end(); ++ip) { 9194ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn if ((*ip)->getPid() == pid) { 9204ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn return u.getUid(); 9214ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn } 9224ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn } 9234ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn } 9244ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn } 9254ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn return getuid(); // associate this with the logger 9264ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn} 927