LogStatistics.h revision f99a7d602a6fe90058e47d5e6140dfc9b30f7481
134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn/* 234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * Copyright (C) 2014 The Android Open Source Project 334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * 434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * Licensed under the Apache License, Version 2.0 (the "License"); 534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * you may not use this file except in compliance with the License. 634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * You may obtain a copy of the License at 734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * 834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * http://www.apache.org/licenses/LICENSE-2.0 934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * 1034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * Unless required by applicable law or agreed to in writing, software 1134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * distributed under the License is distributed on an "AS IS" BASIS, 1234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * See the License for the specific language governing permissions and 1434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * limitations under the License. 1534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn */ 1634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 1734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#ifndef _LOGD_LOG_STATISTICS_H__ 1834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#define _LOGD_LOG_STATISTICS_H__ 1934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 20b545e1c9e3d5989e2e889e65436524fdcfed930eMark Salyzyn#include <ctype.h> 21f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn#include <inttypes.h> 22f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn#include <stdint.h> 23720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn#include <stdlib.h> 24f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn#include <string.h> 2534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#include <sys/types.h> 2634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 27501c373916e292764400dbae735f44b33378400fMark Salyzyn#include <algorithm> // std::max 28f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn#include <experimental/string_view> 29b545e1c9e3d5989e2e889e65436524fdcfed930eMark Salyzyn#include <memory> 30501c373916e292764400dbae735f44b33378400fMark Salyzyn#include <string> // std::string 31511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn#include <unordered_map> 32511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn 334f71319df011d796a60a43fc1bc68e16fbf7d321Elliott Hughes#include <android-base/stringprintf.h> 34501c373916e292764400dbae735f44b33378400fMark Salyzyn#include <android/log.h> 3503bb7593e40e8f56d7c5f021bab579674fcc5c8cMark Salyzyn#include <log/log_time.h> 36758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn#include <private/android_filesystem_config.h> 37f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn#include <utils/FastStrcmp.h> 3897c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn 3997c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn#include "LogBufferElement.h" 405ac5c6b19364b5b3061a59db796b2357c95c3b64Mark Salyzyn#include "LogUtils.h" 4134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 4234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#define log_id_for_each(i) \ 43501c373916e292764400dbae735f44b33378400fMark Salyzyn for (log_id_t i = LOG_ID_MIN; (i) < LOG_ID_MAX; (i) = (log_id_t)((i) + 1)) 4434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 45758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzynclass LogStatistics; 46758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn 47720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyntemplate <typename TKey, typename TEntry> 48511338dd575572d567c04d69eaea60627b6c3452Mark Salyzynclass LogHashtable { 49511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn std::unordered_map<TKey, TEntry> map; 50511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn 516d981af12023bcaf22bfa0612a85ae4580ecb971Mark Salyzyn size_t bucket_size() const { 526d981af12023bcaf22bfa0612a85ae4580ecb971Mark Salyzyn size_t count = 0; 536d981af12023bcaf22bfa0612a85ae4580ecb971Mark Salyzyn for (size_t idx = 0; idx < map.bucket_count(); ++idx) { 546d981af12023bcaf22bfa0612a85ae4580ecb971Mark Salyzyn size_t bucket_size = map.bucket_size(idx); 556d981af12023bcaf22bfa0612a85ae4580ecb971Mark Salyzyn if (bucket_size == 0) bucket_size = 1; 566d981af12023bcaf22bfa0612a85ae4580ecb971Mark Salyzyn count += bucket_size; 576d981af12023bcaf22bfa0612a85ae4580ecb971Mark Salyzyn } 586d981af12023bcaf22bfa0612a85ae4580ecb971Mark Salyzyn float load_factor = map.max_load_factor(); 596d981af12023bcaf22bfa0612a85ae4580ecb971Mark Salyzyn if (load_factor < 1.0) return count; 606d981af12023bcaf22bfa0612a85ae4580ecb971Mark Salyzyn return count * load_factor; 616d981af12023bcaf22bfa0612a85ae4580ecb971Mark Salyzyn } 626d981af12023bcaf22bfa0612a85ae4580ecb971Mark Salyzyn 636d981af12023bcaf22bfa0612a85ae4580ecb971Mark Salyzyn static const size_t unordered_map_per_entry_overhead = sizeof(void*); 646d981af12023bcaf22bfa0612a85ae4580ecb971Mark Salyzyn static const size_t unordered_map_bucket_overhead = sizeof(void*); 656d981af12023bcaf22bfa0612a85ae4580ecb971Mark Salyzyn 66501c373916e292764400dbae735f44b33378400fMark Salyzyn public: 67501c373916e292764400dbae735f44b33378400fMark Salyzyn size_t size() const { 68501c373916e292764400dbae735f44b33378400fMark Salyzyn return map.size(); 69501c373916e292764400dbae735f44b33378400fMark Salyzyn } 70b0672290e320113f4b6d8fc6bb2d1e0afe493c5cMark Salyzyn 716d981af12023bcaf22bfa0612a85ae4580ecb971Mark Salyzyn // Estimate unordered_map memory usage. 726d981af12023bcaf22bfa0612a85ae4580ecb971Mark Salyzyn size_t sizeOf() const { 736d981af12023bcaf22bfa0612a85ae4580ecb971Mark Salyzyn return sizeof(*this) + 74b0672290e320113f4b6d8fc6bb2d1e0afe493c5cMark Salyzyn (size() * (sizeof(TEntry) + unordered_map_per_entry_overhead)) + 756d981af12023bcaf22bfa0612a85ae4580ecb971Mark Salyzyn (bucket_size() * sizeof(size_t) + unordered_map_bucket_overhead); 766d981af12023bcaf22bfa0612a85ae4580ecb971Mark Salyzyn } 776d981af12023bcaf22bfa0612a85ae4580ecb971Mark Salyzyn 78511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn typedef typename std::unordered_map<TKey, TEntry>::iterator iterator; 79501c373916e292764400dbae735f44b33378400fMark Salyzyn typedef 80501c373916e292764400dbae735f44b33378400fMark Salyzyn typename std::unordered_map<TKey, TEntry>::const_iterator const_iterator; 81511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn 82501c373916e292764400dbae735f44b33378400fMark Salyzyn std::unique_ptr<const TEntry* []> sort(uid_t uid, pid_t pid, 83ee3b838e13dc2140ac2051c1012d471effd0fd5fMark Salyzyn size_t len) const { 84758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn if (!len) { 85f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn std::unique_ptr<const TEntry* []> sorted(nullptr); 86720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn return sorted; 87720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn } 88720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn 89501c373916e292764400dbae735f44b33378400fMark Salyzyn const TEntry** retval = new const TEntry*[len]; 90758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn memset(retval, 0, sizeof(*retval) * len); 91720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn 92501c373916e292764400dbae735f44b33378400fMark Salyzyn for (const_iterator it = map.begin(); it != map.end(); ++it) { 93501c373916e292764400dbae735f44b33378400fMark Salyzyn const TEntry& entry = it->second; 94ee3b838e13dc2140ac2051c1012d471effd0fd5fMark Salyzyn 95ee3b838e13dc2140ac2051c1012d471effd0fd5fMark Salyzyn if ((uid != AID_ROOT) && (uid != entry.getUid())) { 96ee3b838e13dc2140ac2051c1012d471effd0fd5fMark Salyzyn continue; 97ee3b838e13dc2140ac2051c1012d471effd0fd5fMark Salyzyn } 98ee3b838e13dc2140ac2051c1012d471effd0fd5fMark Salyzyn if (pid && entry.getPid() && (pid != entry.getPid())) { 99ee3b838e13dc2140ac2051c1012d471effd0fd5fMark Salyzyn continue; 100ee3b838e13dc2140ac2051c1012d471effd0fd5fMark Salyzyn } 101ee3b838e13dc2140ac2051c1012d471effd0fd5fMark Salyzyn 102758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn size_t sizes = entry.getSizes(); 103758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn ssize_t index = len - 1; 104501c373916e292764400dbae735f44b33378400fMark Salyzyn while ((!retval[index] || (sizes > retval[index]->getSizes())) && 105501c373916e292764400dbae735f44b33378400fMark Salyzyn (--index >= 0)) 106720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn ; 107758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn if (++index < (ssize_t)len) { 108758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn size_t num = len - index - 1; 109758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn if (num) { 110758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn memmove(&retval[index + 1], &retval[index], 111758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn num * sizeof(retval[0])); 112720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn } 113758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn retval[index] = &entry; 114720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn } 115720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn } 116501c373916e292764400dbae735f44b33378400fMark Salyzyn std::unique_ptr<const TEntry* []> sorted(retval); 117720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn return sorted; 118720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn } 119720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn 120f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn inline iterator add(const TKey& key, const LogBufferElement* element) { 121511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn iterator it = map.find(key); 122511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn if (it == map.end()) { 123758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn it = map.insert(std::make_pair(key, TEntry(element))).first; 124511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn } else { 125758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn it->second.add(element); 12681b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn } 127511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn return it; 12881b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn } 12981b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn 130511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn inline iterator add(TKey key) { 131511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn iterator it = map.find(key); 132511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn if (it == map.end()) { 133511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn it = map.insert(std::make_pair(key, TEntry(key))).first; 134511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn } else { 135511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn it->second.add(key); 13681b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn } 137511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn return it; 13881b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn } 13981b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn 140f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn void subtract(TKey&& key, const LogBufferElement* element) { 141f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn iterator it = map.find(std::move(key)); 142f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn if ((it != map.end()) && it->second.subtract(element)) { 143f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn map.erase(it); 144f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn } 145f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn } 146f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn 147f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn void subtract(const TKey& key, const LogBufferElement* element) { 148511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn iterator it = map.find(key); 149758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn if ((it != map.end()) && it->second.subtract(element)) { 150511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn map.erase(it); 15181b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn } 15281b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn } 15381b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn 154f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn inline void drop(TKey key, const LogBufferElement* element) { 155511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn iterator it = map.find(key); 156511338dd575572d567c04d69eaea60627b6c3452Mark Salyzyn if (it != map.end()) { 157758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn it->second.drop(element); 15881b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn } 15981b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn } 16081b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn 161501c373916e292764400dbae735f44b33378400fMark Salyzyn inline iterator begin() { 162501c373916e292764400dbae735f44b33378400fMark Salyzyn return map.begin(); 163501c373916e292764400dbae735f44b33378400fMark Salyzyn } 164501c373916e292764400dbae735f44b33378400fMark Salyzyn inline const_iterator begin() const { 165501c373916e292764400dbae735f44b33378400fMark Salyzyn return map.begin(); 166501c373916e292764400dbae735f44b33378400fMark Salyzyn } 167501c373916e292764400dbae735f44b33378400fMark Salyzyn inline iterator end() { 168501c373916e292764400dbae735f44b33378400fMark Salyzyn return map.end(); 169501c373916e292764400dbae735f44b33378400fMark Salyzyn } 170501c373916e292764400dbae735f44b33378400fMark Salyzyn inline const_iterator end() const { 171501c373916e292764400dbae735f44b33378400fMark Salyzyn return map.end(); 172501c373916e292764400dbae735f44b33378400fMark Salyzyn } 173758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn 174501c373916e292764400dbae735f44b33378400fMark Salyzyn std::string format(const LogStatistics& stat, uid_t uid, pid_t pid, 175501c373916e292764400dbae735f44b33378400fMark Salyzyn const std::string& name = std::string(""), 176501c373916e292764400dbae735f44b33378400fMark Salyzyn log_id_t id = LOG_ID_MAX) const { 177758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn static const size_t maximum_sorted_entries = 32; 178758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn std::string output; 179501c373916e292764400dbae735f44b33378400fMark Salyzyn std::unique_ptr<const TEntry* []> sorted = 180501c373916e292764400dbae735f44b33378400fMark Salyzyn sort(uid, pid, maximum_sorted_entries); 181758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn if (!sorted.get()) { 182758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn return output; 183758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn } 184758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn bool headerPrinted = false; 185758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn for (size_t index = 0; index < maximum_sorted_entries; ++index) { 186501c373916e292764400dbae735f44b33378400fMark Salyzyn const TEntry* entry = sorted[index]; 187758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn if (!entry) { 188758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn break; 189758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn } 190758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn if (entry->getSizes() <= (sorted[0]->getSizes() / 100)) { 191758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn break; 192758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn } 193758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn if (!headerPrinted) { 194758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn output += "\n\n"; 195758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn output += entry->formatHeader(name, id); 196758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn headerPrinted = true; 197758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn } 198758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn output += entry->format(stat, id); 199758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn } 200758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn return output; 201758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn } 202720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn}; 203720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn 204758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzynnamespace EntryBaseConstants { 205501c373916e292764400dbae735f44b33378400fMark Salyzynstatic constexpr size_t pruned_len = 14; 206501c373916e292764400dbae735f44b33378400fMark Salyzynstatic constexpr size_t total_len = 80; 207758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn} 208758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn 20981b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzynstruct EntryBase { 21097c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn size_t size; 21134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 212501c373916e292764400dbae735f44b33378400fMark Salyzyn EntryBase() : size(0) { 213501c373916e292764400dbae735f44b33378400fMark Salyzyn } 214f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn explicit EntryBase(const LogBufferElement* element) 215f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn : size(element->getMsgLen()) { 216501c373916e292764400dbae735f44b33378400fMark Salyzyn } 21734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 218501c373916e292764400dbae735f44b33378400fMark Salyzyn size_t getSizes() const { 219501c373916e292764400dbae735f44b33378400fMark Salyzyn return size; 220501c373916e292764400dbae735f44b33378400fMark Salyzyn } 22181b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn 222f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn inline void add(const LogBufferElement* element) { 223501c373916e292764400dbae735f44b33378400fMark Salyzyn size += element->getMsgLen(); 224501c373916e292764400dbae735f44b33378400fMark Salyzyn } 225f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn inline bool subtract(const LogBufferElement* element) { 226758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn size -= element->getMsgLen(); 227758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn return !size; 228758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn } 229758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn 230501c373916e292764400dbae735f44b33378400fMark Salyzyn static std::string formatLine(const std::string& name, 231501c373916e292764400dbae735f44b33378400fMark Salyzyn const std::string& size, 232501c373916e292764400dbae735f44b33378400fMark Salyzyn const std::string& pruned) { 233501c373916e292764400dbae735f44b33378400fMark Salyzyn ssize_t drop_len = 234501c373916e292764400dbae735f44b33378400fMark Salyzyn std::max(pruned.length() + 1, EntryBaseConstants::pruned_len); 235501c373916e292764400dbae735f44b33378400fMark Salyzyn ssize_t size_len = 236501c373916e292764400dbae735f44b33378400fMark Salyzyn std::max(size.length() + 1, EntryBaseConstants::total_len - 237501c373916e292764400dbae735f44b33378400fMark Salyzyn name.length() - drop_len - 1); 238501c373916e292764400dbae735f44b33378400fMark Salyzyn 239501c373916e292764400dbae735f44b33378400fMark Salyzyn std::string ret = android::base::StringPrintf( 240501c373916e292764400dbae735f44b33378400fMark Salyzyn "%s%*s%*s", name.c_str(), (int)size_len, size.c_str(), 241501c373916e292764400dbae735f44b33378400fMark Salyzyn (int)drop_len, pruned.c_str()); 242b545e1c9e3d5989e2e889e65436524fdcfed930eMark Salyzyn // remove any trailing spaces 243b545e1c9e3d5989e2e889e65436524fdcfed930eMark Salyzyn size_t pos = ret.size(); 244b545e1c9e3d5989e2e889e65436524fdcfed930eMark Salyzyn size_t len = 0; 245b545e1c9e3d5989e2e889e65436524fdcfed930eMark Salyzyn while (pos && isspace(ret[--pos])) ++len; 246b545e1c9e3d5989e2e889e65436524fdcfed930eMark Salyzyn if (len) ret.erase(pos + 1, len); 247b545e1c9e3d5989e2e889e65436524fdcfed930eMark Salyzyn return ret + "\n"; 248758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn } 24981b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn}; 25081b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn 25181b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzynstruct EntryBaseDropped : public EntryBase { 25281b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn size_t dropped; 25381b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn 254501c373916e292764400dbae735f44b33378400fMark Salyzyn EntryBaseDropped() : dropped(0) { 255501c373916e292764400dbae735f44b33378400fMark Salyzyn } 256f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn explicit EntryBaseDropped(const LogBufferElement* element) 257501c373916e292764400dbae735f44b33378400fMark Salyzyn : EntryBase(element), dropped(element->getDropped()) { 258758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn } 25981b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn 260501c373916e292764400dbae735f44b33378400fMark Salyzyn size_t getDropped() const { 261501c373916e292764400dbae735f44b33378400fMark Salyzyn return dropped; 262501c373916e292764400dbae735f44b33378400fMark Salyzyn } 263ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn 264f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn inline void add(const LogBufferElement* element) { 265758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn dropped += element->getDropped(); 266758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn EntryBase::add(element); 26781b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn } 268f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn inline bool subtract(const LogBufferElement* element) { 269758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn dropped -= element->getDropped(); 270758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn return EntryBase::subtract(element) && !dropped; 27181b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn } 272f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn inline void drop(const LogBufferElement* element) { 27381b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn dropped += 1; 274758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn EntryBase::subtract(element); 27581b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn } 27681b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn}; 27781b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn 27881b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzynstruct UidEntry : public EntryBaseDropped { 27981b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn const uid_t uid; 280ee3b838e13dc2140ac2051c1012d471effd0fd5fMark Salyzyn pid_t pid; 28181b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn 282f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn explicit UidEntry(const LogBufferElement* element) 283501c373916e292764400dbae735f44b33378400fMark Salyzyn : EntryBaseDropped(element), 284501c373916e292764400dbae735f44b33378400fMark Salyzyn uid(element->getUid()), 285501c373916e292764400dbae735f44b33378400fMark Salyzyn pid(element->getPid()) { 286758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn } 28781b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn 288501c373916e292764400dbae735f44b33378400fMark Salyzyn inline const uid_t& getKey() const { 289501c373916e292764400dbae735f44b33378400fMark Salyzyn return uid; 290501c373916e292764400dbae735f44b33378400fMark Salyzyn } 291501c373916e292764400dbae735f44b33378400fMark Salyzyn inline const uid_t& getUid() const { 292501c373916e292764400dbae735f44b33378400fMark Salyzyn return getKey(); 293501c373916e292764400dbae735f44b33378400fMark Salyzyn } 294501c373916e292764400dbae735f44b33378400fMark Salyzyn inline const pid_t& getPid() const { 295501c373916e292764400dbae735f44b33378400fMark Salyzyn return pid; 296501c373916e292764400dbae735f44b33378400fMark Salyzyn } 297ee3b838e13dc2140ac2051c1012d471effd0fd5fMark Salyzyn 298f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn inline void add(const LogBufferElement* element) { 299ee3b838e13dc2140ac2051c1012d471effd0fd5fMark Salyzyn if (pid != element->getPid()) { 300ee3b838e13dc2140ac2051c1012d471effd0fd5fMark Salyzyn pid = -1; 301ee3b838e13dc2140ac2051c1012d471effd0fd5fMark Salyzyn } 302a2c022257c5bed56fbc47de25c5d909bbe880f7bMark Salyzyn EntryBaseDropped::add(element); 303ee3b838e13dc2140ac2051c1012d471effd0fd5fMark Salyzyn } 304758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn 305501c373916e292764400dbae735f44b33378400fMark Salyzyn std::string formatHeader(const std::string& name, log_id_t id) const; 306501c373916e292764400dbae735f44b33378400fMark Salyzyn std::string format(const LogStatistics& stat, log_id_t id) const; 30734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}; 30834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 30981b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzynnamespace android { 31081b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzynuid_t pidToUid(pid_t pid); 31181b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn} 31281b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn 31381b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzynstruct PidEntry : public EntryBaseDropped { 314720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn const pid_t pid; 315720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn uid_t uid; 316501c373916e292764400dbae735f44b33378400fMark Salyzyn char* name; 317720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn 318501c373916e292764400dbae735f44b33378400fMark Salyzyn explicit PidEntry(pid_t pid) 319501c373916e292764400dbae735f44b33378400fMark Salyzyn : EntryBaseDropped(), 320501c373916e292764400dbae735f44b33378400fMark Salyzyn pid(pid), 321501c373916e292764400dbae735f44b33378400fMark Salyzyn uid(android::pidToUid(pid)), 322501c373916e292764400dbae735f44b33378400fMark Salyzyn name(android::pidToName(pid)) { 323501c373916e292764400dbae735f44b33378400fMark Salyzyn } 324f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn explicit PidEntry(const LogBufferElement* element) 325501c373916e292764400dbae735f44b33378400fMark Salyzyn : EntryBaseDropped(element), 326501c373916e292764400dbae735f44b33378400fMark Salyzyn pid(element->getPid()), 327501c373916e292764400dbae735f44b33378400fMark Salyzyn uid(element->getUid()), 328501c373916e292764400dbae735f44b33378400fMark Salyzyn name(android::pidToName(pid)) { 329758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn } 330501c373916e292764400dbae735f44b33378400fMark Salyzyn PidEntry(const PidEntry& element) 331501c373916e292764400dbae735f44b33378400fMark Salyzyn : EntryBaseDropped(element), 332501c373916e292764400dbae735f44b33378400fMark Salyzyn pid(element.pid), 333501c373916e292764400dbae735f44b33378400fMark Salyzyn uid(element.uid), 334f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn name(element.name ? strdup(element.name) : nullptr) { 335758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn } 336501c373916e292764400dbae735f44b33378400fMark Salyzyn ~PidEntry() { 337501c373916e292764400dbae735f44b33378400fMark Salyzyn free(name); 338758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn } 339720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn 340501c373916e292764400dbae735f44b33378400fMark Salyzyn const pid_t& getKey() const { 341501c373916e292764400dbae735f44b33378400fMark Salyzyn return pid; 342501c373916e292764400dbae735f44b33378400fMark Salyzyn } 343501c373916e292764400dbae735f44b33378400fMark Salyzyn const pid_t& getPid() const { 344501c373916e292764400dbae735f44b33378400fMark Salyzyn return getKey(); 345501c373916e292764400dbae735f44b33378400fMark Salyzyn } 346501c373916e292764400dbae735f44b33378400fMark Salyzyn const uid_t& getUid() const { 347501c373916e292764400dbae735f44b33378400fMark Salyzyn return uid; 348501c373916e292764400dbae735f44b33378400fMark Salyzyn } 349501c373916e292764400dbae735f44b33378400fMark Salyzyn const char* getName() const { 350501c373916e292764400dbae735f44b33378400fMark Salyzyn return name; 351501c373916e292764400dbae735f44b33378400fMark Salyzyn } 35281b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn 353758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn inline void add(pid_t newPid) { 3540eeb06b932f185e10377e4494475d2cdd6adfa1bMark Salyzyn if (name && !fastcmp<strncmp>(name, "zygote", 6)) { 355aa43ae2268076227e8b72ea095f8aeac439b3168Mark Salyzyn free(name); 356f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn name = nullptr; 357aa43ae2268076227e8b72ea095f8aeac439b3168Mark Salyzyn } 35881b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn if (!name) { 359758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn name = android::pidToName(newPid); 36081b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn } 36181b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn } 36281b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn 363f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn inline void add(const LogBufferElement* element) { 364758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn uid_t incomingUid = element->getUid(); 365758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn if (getUid() != incomingUid) { 366758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn uid = incomingUid; 36781b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn free(name); 368758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn name = android::pidToName(element->getPid()); 36981b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn } else { 370758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn add(element->getPid()); 37181b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn } 372758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn EntryBaseDropped::add(element); 37381b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn } 374758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn 375501c373916e292764400dbae735f44b33378400fMark Salyzyn std::string formatHeader(const std::string& name, log_id_t id) const; 376501c373916e292764400dbae735f44b33378400fMark Salyzyn std::string format(const LogStatistics& stat, log_id_t id) const; 377344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn}; 378344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn 37917ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzynstruct TidEntry : public EntryBaseDropped { 38017ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn const pid_t tid; 381ee3b838e13dc2140ac2051c1012d471effd0fd5fMark Salyzyn pid_t pid; 38217ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn uid_t uid; 383501c373916e292764400dbae735f44b33378400fMark Salyzyn char* name; 384501c373916e292764400dbae735f44b33378400fMark Salyzyn 385501c373916e292764400dbae735f44b33378400fMark Salyzyn TidEntry(pid_t tid, pid_t pid) 386501c373916e292764400dbae735f44b33378400fMark Salyzyn : EntryBaseDropped(), 387501c373916e292764400dbae735f44b33378400fMark Salyzyn tid(tid), 388501c373916e292764400dbae735f44b33378400fMark Salyzyn pid(pid), 389501c373916e292764400dbae735f44b33378400fMark Salyzyn uid(android::pidToUid(tid)), 390501c373916e292764400dbae735f44b33378400fMark Salyzyn name(android::tidToName(tid)) { 391501c373916e292764400dbae735f44b33378400fMark Salyzyn } 392f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn explicit TidEntry(const LogBufferElement* element) 393501c373916e292764400dbae735f44b33378400fMark Salyzyn : EntryBaseDropped(element), 394501c373916e292764400dbae735f44b33378400fMark Salyzyn tid(element->getTid()), 395501c373916e292764400dbae735f44b33378400fMark Salyzyn pid(element->getPid()), 396501c373916e292764400dbae735f44b33378400fMark Salyzyn uid(element->getUid()), 397501c373916e292764400dbae735f44b33378400fMark Salyzyn name(android::tidToName(tid)) { 398501c373916e292764400dbae735f44b33378400fMark Salyzyn } 399501c373916e292764400dbae735f44b33378400fMark Salyzyn TidEntry(const TidEntry& element) 400501c373916e292764400dbae735f44b33378400fMark Salyzyn : EntryBaseDropped(element), 401501c373916e292764400dbae735f44b33378400fMark Salyzyn tid(element.tid), 402501c373916e292764400dbae735f44b33378400fMark Salyzyn pid(element.pid), 403501c373916e292764400dbae735f44b33378400fMark Salyzyn uid(element.uid), 404f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn name(element.name ? strdup(element.name) : nullptr) { 405501c373916e292764400dbae735f44b33378400fMark Salyzyn } 406501c373916e292764400dbae735f44b33378400fMark Salyzyn ~TidEntry() { 407501c373916e292764400dbae735f44b33378400fMark Salyzyn free(name); 408501c373916e292764400dbae735f44b33378400fMark Salyzyn } 409501c373916e292764400dbae735f44b33378400fMark Salyzyn 410501c373916e292764400dbae735f44b33378400fMark Salyzyn const pid_t& getKey() const { 411501c373916e292764400dbae735f44b33378400fMark Salyzyn return tid; 412501c373916e292764400dbae735f44b33378400fMark Salyzyn } 413501c373916e292764400dbae735f44b33378400fMark Salyzyn const pid_t& getTid() const { 414501c373916e292764400dbae735f44b33378400fMark Salyzyn return getKey(); 415501c373916e292764400dbae735f44b33378400fMark Salyzyn } 416501c373916e292764400dbae735f44b33378400fMark Salyzyn const pid_t& getPid() const { 417501c373916e292764400dbae735f44b33378400fMark Salyzyn return pid; 418501c373916e292764400dbae735f44b33378400fMark Salyzyn } 419501c373916e292764400dbae735f44b33378400fMark Salyzyn const uid_t& getUid() const { 420501c373916e292764400dbae735f44b33378400fMark Salyzyn return uid; 421501c373916e292764400dbae735f44b33378400fMark Salyzyn } 422501c373916e292764400dbae735f44b33378400fMark Salyzyn const char* getName() const { 423501c373916e292764400dbae735f44b33378400fMark Salyzyn return name; 424501c373916e292764400dbae735f44b33378400fMark Salyzyn } 42517ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn 426758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn inline void add(pid_t incomingTid) { 4270eeb06b932f185e10377e4494475d2cdd6adfa1bMark Salyzyn if (name && !fastcmp<strncmp>(name, "zygote", 6)) { 42817ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn free(name); 429f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn name = nullptr; 43017ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn } 43117ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn if (!name) { 432758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn name = android::tidToName(incomingTid); 43317ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn } 43417ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn } 43517ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn 436f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn inline void add(const LogBufferElement* element) { 437758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn uid_t incomingUid = element->getUid(); 438ee3b838e13dc2140ac2051c1012d471effd0fd5fMark Salyzyn pid_t incomingPid = element->getPid(); 439ee3b838e13dc2140ac2051c1012d471effd0fd5fMark Salyzyn if ((getUid() != incomingUid) || (getPid() != incomingPid)) { 440758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn uid = incomingUid; 441ee3b838e13dc2140ac2051c1012d471effd0fd5fMark Salyzyn pid = incomingPid; 44217ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn free(name); 443758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn name = android::tidToName(element->getTid()); 44417ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn } else { 445758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn add(element->getTid()); 44617ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn } 447758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn EntryBaseDropped::add(element); 44817ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn } 449758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn 450501c373916e292764400dbae735f44b33378400fMark Salyzyn std::string formatHeader(const std::string& name, log_id_t id) const; 451501c373916e292764400dbae735f44b33378400fMark Salyzyn std::string format(const LogStatistics& stat, log_id_t id) const; 45217ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn}; 45317ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn 4546a06694a610d103afdf424b0bb69dc8f7f2b8e5aMark Salyzynstruct TagEntry : public EntryBaseDropped { 455344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn const uint32_t tag; 456ee3b838e13dc2140ac2051c1012d471effd0fd5fMark Salyzyn pid_t pid; 457344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn uid_t uid; 458344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn 459f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn explicit TagEntry(const LogBufferElement* element) 460501c373916e292764400dbae735f44b33378400fMark Salyzyn : EntryBaseDropped(element), 461501c373916e292764400dbae735f44b33378400fMark Salyzyn tag(element->getTag()), 462501c373916e292764400dbae735f44b33378400fMark Salyzyn pid(element->getPid()), 463501c373916e292764400dbae735f44b33378400fMark Salyzyn uid(element->getUid()) { 464758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn } 465344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn 466501c373916e292764400dbae735f44b33378400fMark Salyzyn const uint32_t& getKey() const { 467501c373916e292764400dbae735f44b33378400fMark Salyzyn return tag; 468501c373916e292764400dbae735f44b33378400fMark Salyzyn } 469501c373916e292764400dbae735f44b33378400fMark Salyzyn const pid_t& getPid() const { 470501c373916e292764400dbae735f44b33378400fMark Salyzyn return pid; 471501c373916e292764400dbae735f44b33378400fMark Salyzyn } 472501c373916e292764400dbae735f44b33378400fMark Salyzyn const uid_t& getUid() const { 473501c373916e292764400dbae735f44b33378400fMark Salyzyn return uid; 474501c373916e292764400dbae735f44b33378400fMark Salyzyn } 475501c373916e292764400dbae735f44b33378400fMark Salyzyn const char* getName() const { 476501c373916e292764400dbae735f44b33378400fMark Salyzyn return android::tagToName(tag); 477501c373916e292764400dbae735f44b33378400fMark Salyzyn } 47881b3eabc49736b89c4f99940f79785074955eaa5Mark Salyzyn 479f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn inline void add(const LogBufferElement* element) { 480ee3b838e13dc2140ac2051c1012d471effd0fd5fMark Salyzyn if (uid != element->getUid()) { 481344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn uid = -1; 482344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn } 483ee3b838e13dc2140ac2051c1012d471effd0fd5fMark Salyzyn if (pid != element->getPid()) { 484ee3b838e13dc2140ac2051c1012d471effd0fd5fMark Salyzyn pid = -1; 485ee3b838e13dc2140ac2051c1012d471effd0fd5fMark Salyzyn } 486a2c022257c5bed56fbc47de25c5d909bbe880f7bMark Salyzyn EntryBaseDropped::add(element); 487344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn } 488758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn 489501c373916e292764400dbae735f44b33378400fMark Salyzyn std::string formatHeader(const std::string& name, log_id_t id) const; 490501c373916e292764400dbae735f44b33378400fMark Salyzyn std::string format(const LogStatistics& stat, log_id_t id) const; 491720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn}; 492720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn 493f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzynstruct TagNameKey { 494f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn std::string* alloc; 495f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn std::experimental::string_view name; // Saves space if const char* 496f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn 497f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn explicit TagNameKey(const LogBufferElement* element) 498f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn : alloc(nullptr), name("", strlen("")) { 499f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn if (element->isBinary()) { 500f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn uint32_t tag = element->getTag(); 501f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn if (tag) { 502f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn const char* cp = android::tagToName(tag); 503f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn if (cp) { 504f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn name = std::experimental::string_view(cp, strlen(cp)); 505f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn return; 506f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn } 507f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn } 508f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn alloc = new std::string( 509f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn android::base::StringPrintf("[%" PRIu32 "]", tag)); 510f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn if (!alloc) return; 511f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn name = std::experimental::string_view(alloc->c_str(), alloc->size()); 512f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn return; 513f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn } 514f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn const char* msg = element->getMsg(); 515f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn if (!msg) { 516f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn name = std::experimental::string_view("chatty", strlen("chatty")); 517f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn return; 518f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn } 519f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn ++msg; 520f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn unsigned short len = element->getMsgLen(); 521f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn len = (len <= 1) ? 0 : strnlen(msg, len - 1); 522f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn if (!len) { 523f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn name = std::experimental::string_view("<NULL>", strlen("<NULL>")); 524f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn return; 525f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn } 526f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn alloc = new std::string(msg, len); 527f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn if (!alloc) return; 528f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn name = std::experimental::string_view(alloc->c_str(), alloc->size()); 529f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn } 530f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn 531f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn explicit TagNameKey(TagNameKey&& rval) 532f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn : alloc(rval.alloc), name(rval.name.data(), rval.name.length()) { 533f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn rval.alloc = nullptr; 534f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn } 535f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn 536f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn explicit TagNameKey(const TagNameKey& rval) 537f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn : alloc(rval.alloc ? new std::string(*rval.alloc) : nullptr), 538f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn name(alloc ? alloc->data() : rval.name.data(), rval.name.length()) { 539f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn } 540f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn 541f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn ~TagNameKey() { 542f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn if (alloc) delete alloc; 543f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn } 544f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn 545f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn operator const std::experimental::string_view() const { 546f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn return name; 547f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn } 548f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn 549f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn const char* data() const { 550f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn return name.data(); 551f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn } 552f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn size_t length() const { 553f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn return name.length(); 554f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn } 555f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn 556f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn bool operator==(const TagNameKey& rval) const { 557f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn if (length() != rval.length()) return false; 558f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn if (length() == 0) return true; 559f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn return fastcmp<strncmp>(data(), rval.data(), length()) == 0; 560f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn } 561f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn bool operator!=(const TagNameKey& rval) const { 562f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn return !(*this == rval); 563f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn } 564f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn 565f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn size_t getAllocLength() const { 566f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn return alloc ? alloc->length() + 1 + sizeof(std::string) : 0; 567f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn } 568f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn}; 569f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn 570f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn// Hash for TagNameKey 571f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyntemplate <> 572f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzynstruct std::hash<TagNameKey> 573f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn : public std::unary_function<const TagNameKey&, size_t> { 574f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn size_t operator()(const TagNameKey& __t) const noexcept { 575f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn if (!__t.length()) return 0; 576f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn return std::hash<std::experimental::string_view>()( 577f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn std::experimental::string_view(__t)); 578f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn } 579f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn}; 580f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn 581f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzynstruct TagNameEntry : public EntryBase { 582f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn pid_t tid; 583f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn pid_t pid; 584f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn uid_t uid; 585f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn TagNameKey name; 586f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn 587f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn explicit TagNameEntry(const LogBufferElement* element) 588f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn : EntryBase(element), 589f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn tid(element->getTid()), 590f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn pid(element->getPid()), 591f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn uid(element->getUid()), 592f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn name(element) { 593f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn } 594f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn 595f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn const TagNameKey& getKey() const { 596f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn return name; 597f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn } 598f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn const pid_t& getTid() const { 599f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn return tid; 600f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn } 601f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn const pid_t& getPid() const { 602f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn return pid; 603f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn } 604f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn const uid_t& getUid() const { 605f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn return uid; 606f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn } 607f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn const char* getName() const { 608f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn return name.data(); 609f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn } 610f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn size_t getNameAllocLength() const { 611f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn return name.getAllocLength(); 612f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn } 613f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn 614f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn inline void add(const LogBufferElement* element) { 615f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn if (uid != element->getUid()) { 616f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn uid = -1; 617f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn } 618f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn if (pid != element->getPid()) { 619f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn pid = -1; 620f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn } 621f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn if (tid != element->getTid()) { 622f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn tid = -1; 623f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn } 624f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn EntryBase::add(element); 625f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn } 626f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn 627f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn std::string formatHeader(const std::string& name, log_id_t id) const; 628f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn std::string format(const LogStatistics& stat, log_id_t id) const; 629f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn}; 630f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn 6316a06694a610d103afdf424b0bb69dc8f7f2b8e5aMark Salyzyntemplate <typename TEntry> 6326a06694a610d103afdf424b0bb69dc8f7f2b8e5aMark Salyzynclass LogFindWorst { 633501c373916e292764400dbae735f44b33378400fMark Salyzyn std::unique_ptr<const TEntry* []> sorted; 6346a06694a610d103afdf424b0bb69dc8f7f2b8e5aMark Salyzyn 635501c373916e292764400dbae735f44b33378400fMark Salyzyn public: 636501c373916e292764400dbae735f44b33378400fMark Salyzyn explicit LogFindWorst(std::unique_ptr<const TEntry* []>&& sorted) 637501c373916e292764400dbae735f44b33378400fMark Salyzyn : sorted(std::move(sorted)) { 638501c373916e292764400dbae735f44b33378400fMark Salyzyn } 6396a06694a610d103afdf424b0bb69dc8f7f2b8e5aMark Salyzyn 640501c373916e292764400dbae735f44b33378400fMark Salyzyn void findWorst(int& worst, size_t& worst_sizes, size_t& second_worst_sizes, 641501c373916e292764400dbae735f44b33378400fMark Salyzyn size_t threshold) { 6426a06694a610d103afdf424b0bb69dc8f7f2b8e5aMark Salyzyn if (sorted.get() && sorted[0] && sorted[1]) { 6436a06694a610d103afdf424b0bb69dc8f7f2b8e5aMark Salyzyn worst_sizes = sorted[0]->getSizes(); 6446a06694a610d103afdf424b0bb69dc8f7f2b8e5aMark Salyzyn if ((worst_sizes > threshold) 6456a06694a610d103afdf424b0bb69dc8f7f2b8e5aMark Salyzyn // Allow time horizon to extend roughly tenfold, assume 6466a06694a610d103afdf424b0bb69dc8f7f2b8e5aMark Salyzyn // average entry length is 100 characters. 647501c373916e292764400dbae735f44b33378400fMark Salyzyn && (worst_sizes > (10 * sorted[0]->getDropped()))) { 6486a06694a610d103afdf424b0bb69dc8f7f2b8e5aMark Salyzyn worst = sorted[0]->getKey(); 6496a06694a610d103afdf424b0bb69dc8f7f2b8e5aMark Salyzyn second_worst_sizes = sorted[1]->getSizes(); 6506a06694a610d103afdf424b0bb69dc8f7f2b8e5aMark Salyzyn if (second_worst_sizes < threshold) { 6516a06694a610d103afdf424b0bb69dc8f7f2b8e5aMark Salyzyn second_worst_sizes = threshold; 6526a06694a610d103afdf424b0bb69dc8f7f2b8e5aMark Salyzyn } 6536a06694a610d103afdf424b0bb69dc8f7f2b8e5aMark Salyzyn } 6546a06694a610d103afdf424b0bb69dc8f7f2b8e5aMark Salyzyn } 6556a06694a610d103afdf424b0bb69dc8f7f2b8e5aMark Salyzyn } 6566a06694a610d103afdf424b0bb69dc8f7f2b8e5aMark Salyzyn 657501c373916e292764400dbae735f44b33378400fMark Salyzyn void findWorst(int& worst, size_t worst_sizes, size_t& second_worst_sizes) { 6586a06694a610d103afdf424b0bb69dc8f7f2b8e5aMark Salyzyn if (sorted.get() && sorted[0] && sorted[1]) { 6596a06694a610d103afdf424b0bb69dc8f7f2b8e5aMark Salyzyn worst = sorted[0]->getKey(); 660501c373916e292764400dbae735f44b33378400fMark Salyzyn second_worst_sizes = 661501c373916e292764400dbae735f44b33378400fMark Salyzyn worst_sizes - sorted[0]->getSizes() + sorted[1]->getSizes(); 6626a06694a610d103afdf424b0bb69dc8f7f2b8e5aMark Salyzyn } 6636a06694a610d103afdf424b0bb69dc8f7f2b8e5aMark Salyzyn } 6646a06694a610d103afdf424b0bb69dc8f7f2b8e5aMark Salyzyn}; 6656a06694a610d103afdf424b0bb69dc8f7f2b8e5aMark Salyzyn 66634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn// Log Statistics 66734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynclass LogStatistics { 668c723df805a1a3199577cac947cebf2ab53abdb34Mark Salyzyn friend UidEntry; 669c723df805a1a3199577cac947cebf2ab53abdb34Mark Salyzyn 67034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn size_t mSizes[LOG_ID_MAX]; 67134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn size_t mElements[LOG_ID_MAX]; 67258b8be8906f903ac3d83c41bcb0fb9c7841945f0Mark Salyzyn size_t mDroppedElements[LOG_ID_MAX]; 67397c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn size_t mSizesTotal[LOG_ID_MAX]; 67497c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn size_t mElementsTotal[LOG_ID_MAX]; 67503bb7593e40e8f56d7c5f021bab579674fcc5c8cMark Salyzyn log_time mOldest[LOG_ID_MAX]; 67603bb7593e40e8f56d7c5f021bab579674fcc5c8cMark Salyzyn log_time mNewest[LOG_ID_MAX]; 67703bb7593e40e8f56d7c5f021bab579674fcc5c8cMark Salyzyn log_time mNewestDropped[LOG_ID_MAX]; 6783296291cffd13af13ea9e60a8ac1138101cf8e4cMark Salyzyn static size_t SizesTotal; 679720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn bool enable; 68034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 68197c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn // uid to size list 682720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn typedef LogHashtable<uid_t, UidEntry> uidTable_t; 68397c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn uidTable_t uidTable[LOG_ID_MAX]; 684e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn 685bec3c3def945576d59d3344c16e149e6d9154e15Mark Salyzyn // pid of system to size list 686bec3c3def945576d59d3344c16e149e6d9154e15Mark Salyzyn typedef LogHashtable<pid_t, PidEntry> pidSystemTable_t; 687bec3c3def945576d59d3344c16e149e6d9154e15Mark Salyzyn pidSystemTable_t pidSystemTable[LOG_ID_MAX]; 688bec3c3def945576d59d3344c16e149e6d9154e15Mark Salyzyn 689720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn // pid to uid list 690720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn typedef LogHashtable<pid_t, PidEntry> pidTable_t; 691720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn pidTable_t pidTable; 692720f6d1d55d936d98cc9752e96f479e03e6d5009Mark Salyzyn 69317ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn // tid to uid list 69417ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn typedef LogHashtable<pid_t, TidEntry> tidTable_t; 69517ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn tidTable_t tidTable; 69617ed6797df722464eb5cc6dfc3e1e32aec284b70Mark Salyzyn 697344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn // tag list 698344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn typedef LogHashtable<uint32_t, TagEntry> tagTable_t; 699344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn tagTable_t tagTable; 700344bff4391dd434dda501e812f18f524290c5a7cMark Salyzyn 701083b037c0740ca00f72429e4457bfdd4b4d4dfa7Mark Salyzyn // security tag list 702083b037c0740ca00f72429e4457bfdd4b4d4dfa7Mark Salyzyn tagTable_t securityTagTable; 703083b037c0740ca00f72429e4457bfdd4b4d4dfa7Mark Salyzyn 704f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn // global tag list 705f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn typedef LogHashtable<TagNameKey, TagNameEntry> tagNameTable_t; 706f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn tagNameTable_t tagNameTable; 707f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn 7086d981af12023bcaf22bfa0612a85ae4580ecb971Mark Salyzyn size_t sizeOf() const { 7096d981af12023bcaf22bfa0612a85ae4580ecb971Mark Salyzyn size_t size = sizeof(*this) + pidTable.sizeOf() + tidTable.sizeOf() + 710b0672290e320113f4b6d8fc6bb2d1e0afe493c5cMark Salyzyn tagTable.sizeOf() + securityTagTable.sizeOf() + 711f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn tagNameTable.sizeOf() + 712b0672290e320113f4b6d8fc6bb2d1e0afe493c5cMark Salyzyn (pidTable.size() * sizeof(pidTable_t::iterator)) + 713b0672290e320113f4b6d8fc6bb2d1e0afe493c5cMark Salyzyn (tagTable.size() * sizeof(tagTable_t::iterator)); 714501c373916e292764400dbae735f44b33378400fMark Salyzyn for (auto it : pidTable) { 7156d981af12023bcaf22bfa0612a85ae4580ecb971Mark Salyzyn const char* name = it.second.getName(); 7166d981af12023bcaf22bfa0612a85ae4580ecb971Mark Salyzyn if (name) size += strlen(name) + 1; 7176d981af12023bcaf22bfa0612a85ae4580ecb971Mark Salyzyn } 718501c373916e292764400dbae735f44b33378400fMark Salyzyn for (auto it : tidTable) { 7196d981af12023bcaf22bfa0612a85ae4580ecb971Mark Salyzyn const char* name = it.second.getName(); 7206d981af12023bcaf22bfa0612a85ae4580ecb971Mark Salyzyn if (name) size += strlen(name) + 1; 7216d981af12023bcaf22bfa0612a85ae4580ecb971Mark Salyzyn } 722f99a7d602a6fe90058e47d5e6140dfc9b30f7481Mark Salyzyn for (auto it : tagNameTable) size += it.second.getNameAllocLength(); 7236d981af12023bcaf22bfa0612a85ae4580ecb971Mark Salyzyn log_id_for_each(id) { 7246d981af12023bcaf22bfa0612a85ae4580ecb971Mark Salyzyn size += uidTable[id].sizeOf(); 725b0672290e320113f4b6d8fc6bb2d1e0afe493c5cMark Salyzyn size += uidTable[id].size() * sizeof(uidTable_t::iterator); 7266d981af12023bcaf22bfa0612a85ae4580ecb971Mark Salyzyn size += pidSystemTable[id].sizeOf(); 727501c373916e292764400dbae735f44b33378400fMark Salyzyn size += 728501c373916e292764400dbae735f44b33378400fMark Salyzyn pidSystemTable[id].size() * sizeof(pidSystemTable_t::iterator); 7296d981af12023bcaf22bfa0612a85ae4580ecb971Mark Salyzyn } 7306d981af12023bcaf22bfa0612a85ae4580ecb971Mark Salyzyn return size; 7316d981af12023bcaf22bfa0612a85ae4580ecb971Mark Salyzyn } 7326d981af12023bcaf22bfa0612a85ae4580ecb971Mark Salyzyn 733501c373916e292764400dbae735f44b33378400fMark Salyzyn public: 73434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn LogStatistics(); 73534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 736501c373916e292764400dbae735f44b33378400fMark Salyzyn void enableStatistics() { 737501c373916e292764400dbae735f44b33378400fMark Salyzyn enable = true; 738501c373916e292764400dbae735f44b33378400fMark Salyzyn } 73934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 74002dd2f42f8713b09ed0526e4eb49812957b66d5eMark Salyzyn void addTotal(LogBufferElement* entry); 741501c373916e292764400dbae735f44b33378400fMark Salyzyn void add(LogBufferElement* entry); 742501c373916e292764400dbae735f44b33378400fMark Salyzyn void subtract(LogBufferElement* entry); 743ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn // entry->setDropped(1) must follow this call 744501c373916e292764400dbae735f44b33378400fMark Salyzyn void drop(LogBufferElement* entry); 745aaad42f47c7363d68ddfb9ef8f1b51972c4d429dMark Salyzyn // Correct for coalescing two entries referencing dropped content 746501c373916e292764400dbae735f44b33378400fMark Salyzyn void erase(LogBufferElement* element) { 74758b8be8906f903ac3d83c41bcb0fb9c7841945f0Mark Salyzyn log_id_t log_id = element->getLogId(); 74858b8be8906f903ac3d83c41bcb0fb9c7841945f0Mark Salyzyn --mElements[log_id]; 74958b8be8906f903ac3d83c41bcb0fb9c7841945f0Mark Salyzyn --mDroppedElements[log_id]; 75058b8be8906f903ac3d83c41bcb0fb9c7841945f0Mark Salyzyn } 751e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn 7526a06694a610d103afdf424b0bb69dc8f7f2b8e5aMark Salyzyn LogFindWorst<UidEntry> sort(uid_t uid, pid_t pid, size_t len, log_id id) { 7536a06694a610d103afdf424b0bb69dc8f7f2b8e5aMark Salyzyn return LogFindWorst<UidEntry>(uidTable[id].sort(uid, pid, len)); 7546a06694a610d103afdf424b0bb69dc8f7f2b8e5aMark Salyzyn } 755501c373916e292764400dbae735f44b33378400fMark Salyzyn LogFindWorst<PidEntry> sortPids(uid_t uid, pid_t pid, size_t len, 756501c373916e292764400dbae735f44b33378400fMark Salyzyn log_id id) { 7576a06694a610d103afdf424b0bb69dc8f7f2b8e5aMark Salyzyn return LogFindWorst<PidEntry>(pidSystemTable[id].sort(uid, pid, len)); 758758058ffd8820df71c27db7675c50a90a5fa02b4Mark Salyzyn } 7596a06694a610d103afdf424b0bb69dc8f7f2b8e5aMark Salyzyn LogFindWorst<TagEntry> sortTags(uid_t uid, pid_t pid, size_t len, log_id) { 7606a06694a610d103afdf424b0bb69dc8f7f2b8e5aMark Salyzyn return LogFindWorst<TagEntry>(tagTable.sort(uid, pid, len)); 761bec3c3def945576d59d3344c16e149e6d9154e15Mark Salyzyn } 76234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 76334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn // fast track current value by id only 764501c373916e292764400dbae735f44b33378400fMark Salyzyn size_t sizes(log_id_t id) const { 765501c373916e292764400dbae735f44b33378400fMark Salyzyn return mSizes[id]; 766501c373916e292764400dbae735f44b33378400fMark Salyzyn } 767501c373916e292764400dbae735f44b33378400fMark Salyzyn size_t elements(log_id_t id) const { 768501c373916e292764400dbae735f44b33378400fMark Salyzyn return mElements[id]; 769501c373916e292764400dbae735f44b33378400fMark Salyzyn } 77058b8be8906f903ac3d83c41bcb0fb9c7841945f0Mark Salyzyn size_t realElements(log_id_t id) const { 77158b8be8906f903ac3d83c41bcb0fb9c7841945f0Mark Salyzyn return mElements[id] - mDroppedElements[id]; 77258b8be8906f903ac3d83c41bcb0fb9c7841945f0Mark Salyzyn } 773501c373916e292764400dbae735f44b33378400fMark Salyzyn size_t sizesTotal(log_id_t id) const { 774501c373916e292764400dbae735f44b33378400fMark Salyzyn return mSizesTotal[id]; 775501c373916e292764400dbae735f44b33378400fMark Salyzyn } 776501c373916e292764400dbae735f44b33378400fMark Salyzyn size_t elementsTotal(log_id_t id) const { 777501c373916e292764400dbae735f44b33378400fMark Salyzyn return mElementsTotal[id]; 778501c373916e292764400dbae735f44b33378400fMark Salyzyn } 779501c373916e292764400dbae735f44b33378400fMark Salyzyn static size_t sizesTotal() { 780501c373916e292764400dbae735f44b33378400fMark Salyzyn return SizesTotal; 781501c373916e292764400dbae735f44b33378400fMark Salyzyn } 78234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 783ee3b838e13dc2140ac2051c1012d471effd0fd5fMark Salyzyn std::string format(uid_t uid, pid_t pid, unsigned int logMask) const; 7849a03863e88da99ba010342c874252089dd771f7fMark Salyzyn 785ed777e9eece54bf899f1a77a83f8b702970de686Mark Salyzyn // helper (must be locked directly or implicitly by mLogElementsLock) 786501c373916e292764400dbae735f44b33378400fMark Salyzyn const char* pidToName(pid_t pid) const; 7874ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn uid_t pidToUid(pid_t pid); 788501c373916e292764400dbae735f44b33378400fMark Salyzyn const char* uidToName(uid_t uid) const; 78934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn}; 79034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn 791501c373916e292764400dbae735f44b33378400fMark Salyzyn#endif // _LOGD_LOG_STATISTICS_H__ 792