LogStatistics.h revision 18a5432158ad43b8faefe4950b30e760200ce0b4
1/* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#ifndef _LOGD_LOG_STATISTICS_H__ 18#define _LOGD_LOG_STATISTICS_H__ 19 20#include <sys/types.h> 21 22#include <log/log.h> 23#include <log/log_read.h> 24#include <utils/List.h> 25 26#define log_id_for_each(i) \ 27 for (log_id_t i = LOG_ID_MIN; i < LOG_ID_MAX; i = (log_id_t) (i + 1)) 28 29class PidStatistics { 30 const pid_t pid; 31 32 // Total 33 size_t mSizesTotal; 34 size_t mElementsTotal; 35 // Current 36 size_t mSizes; 37 size_t mElements; 38 39public: 40 static const pid_t gone = (pid_t) -1; 41 42 PidStatistics(pid_t pid); 43 44 pid_t getPid() const { return pid; } 45 46 void add(unsigned short size); 47 bool subtract(unsigned short size); // returns true if stats and PID gone 48 void addTotal(size_t size, size_t element); 49 50 size_t sizes() const { return mSizes; } 51 size_t elements() const { return mElements; } 52 53 size_t sizesTotal() const { return mSizesTotal; } 54 size_t elementsTotal() const { return mElementsTotal; } 55}; 56 57typedef android::List<PidStatistics *> PidStatisticsCollection; 58 59class UidStatistics { 60 const uid_t uid; 61 62 PidStatisticsCollection Pids; 63 64public: 65 UidStatistics(uid_t uid); 66 ~UidStatistics(); 67 68 PidStatisticsCollection::iterator begin() { return Pids.begin(); } 69 PidStatisticsCollection::iterator end() { return Pids.end(); } 70 71 uid_t getUid() { return uid; } 72 73 void add(unsigned short size, pid_t pid); 74 void subtract(unsigned short size, pid_t pid); 75 76 static const pid_t pid_all = (pid_t) -1; 77 78 size_t sizes(pid_t pid = pid_all); 79 size_t elements(pid_t pid = pid_all); 80 81 size_t sizesTotal(pid_t pid = pid_all); 82 size_t elementsTotal(pid_t pid = pid_all); 83}; 84 85typedef android::List<UidStatistics *> UidStatisticsCollection; 86 87class LidStatistics { 88 UidStatisticsCollection Uids; 89 90public: 91 LidStatistics(); 92 ~LidStatistics(); 93 94 UidStatisticsCollection::iterator begin() { return Uids.begin(); } 95 UidStatisticsCollection::iterator end() { return Uids.end(); } 96 97 void add(unsigned short size, uid_t uid, pid_t pid); 98 void subtract(unsigned short size, uid_t uid, pid_t pid); 99 100 static const pid_t pid_all = (pid_t) -1; 101 static const uid_t uid_all = (uid_t) -1; 102 103 size_t sizes(uid_t uid = uid_all, pid_t pid = pid_all); 104 size_t elements(uid_t uid = uid_all, pid_t pid = pid_all); 105 106 size_t sizesTotal(uid_t uid = uid_all, pid_t pid = pid_all); 107 size_t elementsTotal(uid_t uid = uid_all, pid_t pid = pid_all); 108}; 109 110// Log Statistics 111class LogStatistics { 112 LidStatistics LogIds[LOG_ID_MAX]; 113 114 size_t mSizes[LOG_ID_MAX]; 115 size_t mElements[LOG_ID_MAX]; 116 117public: 118 const log_time start; 119 120 LogStatistics(); 121 122 LidStatistics &id(log_id_t log_id) { return LogIds[log_id]; } 123 124 void add(unsigned short size, log_id_t log_id, uid_t uid, pid_t pid); 125 void subtract(unsigned short size, log_id_t log_id, uid_t uid, pid_t pid); 126 127 // fast track current value by id only 128 size_t sizes(log_id_t id) const { return mSizes[id]; } 129 size_t elements(log_id_t id) const { return mElements[id]; } 130 131 // statistical track 132 static const log_id_t log_id_all = (log_id_t) -1; 133 static const uid_t uid_all = (uid_t) -1; 134 static const pid_t pid_all = (pid_t) -1; 135 136 size_t sizes(log_id_t id, uid_t uid, pid_t pid = pid_all); 137 size_t elements(log_id_t id, uid_t uid, pid_t pid = pid_all); 138 size_t sizes() { return sizes(log_id_all, uid_all); } 139 size_t elements() { return elements(log_id_all, uid_all); } 140 141 size_t sizesTotal(log_id_t id = log_id_all, 142 uid_t uid = uid_all, 143 pid_t pid = pid_all); 144 size_t elementsTotal(log_id_t id = log_id_all, 145 uid_t uid = uid_all, 146 pid_t pid = pid_all); 147 148 // *strp = malloc, balance with free 149 void format(char **strp, uid_t uid, unsigned int logMask, log_time oldest); 150}; 151 152#endif // _LOGD_LOG_STATISTICS_H__ 153