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