Loading logd/LogStatistics.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -547,6 +547,7 @@ std::string LogStatistics::format(uid_t uid, pid_t pid, } spaces += spaces_total; } totalSize += sizeOf(); if (spaces < 0) spaces = 0; output += android::base::StringPrintf("%*s%zu", spaces, "", totalSize); Loading logd/LogStatistics.h +48 −0 Original line number Diff line number Diff line Loading @@ -42,8 +42,32 @@ class LogHashtable { std::unordered_map<TKey, TEntry> map; size_t bucket_size() const { size_t count = 0; for (size_t idx = 0; idx < map.bucket_count(); ++idx) { size_t bucket_size = map.bucket_size(idx); if (bucket_size == 0) bucket_size = 1; count += bucket_size; } float load_factor = map.max_load_factor(); if (load_factor < 1.0) return count; return count * load_factor; } static const size_t unordered_map_per_entry_overhead = sizeof(void*); static const size_t unordered_map_bucket_overhead = sizeof(void*); public: size_t size() const { return map.size(); } // Estimate unordered_map memory usage. size_t sizeOf() const { return sizeof(*this) + (size() * (sizeof(TEntry) + unordered_map_per_entry_overhead)) + (bucket_size() * sizeof(size_t) + unordered_map_bucket_overhead); } typedef typename std::unordered_map<TKey, TEntry>::iterator iterator; typedef typename std::unordered_map<TKey, TEntry>::const_iterator const_iterator; Loading Loading @@ -155,6 +179,7 @@ public: } return output; } }; namespace EntryBaseConstants { Loading Loading @@ -472,7 +497,30 @@ class LogStatistics { // security tag list tagTable_t securityTagTable; size_t sizeOf() const { size_t size = sizeof(*this) + pidTable.sizeOf() + tidTable.sizeOf() + tagTable.sizeOf() + securityTagTable.sizeOf() + (pidTable.size() * sizeof(pidTable_t::iterator)) + (tagTable.size() * sizeof(tagTable_t::iterator)); for(auto it : pidTable) { const char* name = it.second.getName(); if (name) size += strlen(name) + 1; } for(auto it : tidTable) { const char* name = it.second.getName(); if (name) size += strlen(name) + 1; } log_id_for_each(id) { size += uidTable[id].sizeOf(); size += uidTable[id].size() * sizeof(uidTable_t::iterator); size += pidSystemTable[id].sizeOf(); size += pidSystemTable[id].size() * sizeof(pidSystemTable_t::iterator); } return size; } public: LogStatistics(); void enableStatistics() { enable = true; } Loading Loading
logd/LogStatistics.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -547,6 +547,7 @@ std::string LogStatistics::format(uid_t uid, pid_t pid, } spaces += spaces_total; } totalSize += sizeOf(); if (spaces < 0) spaces = 0; output += android::base::StringPrintf("%*s%zu", spaces, "", totalSize); Loading
logd/LogStatistics.h +48 −0 Original line number Diff line number Diff line Loading @@ -42,8 +42,32 @@ class LogHashtable { std::unordered_map<TKey, TEntry> map; size_t bucket_size() const { size_t count = 0; for (size_t idx = 0; idx < map.bucket_count(); ++idx) { size_t bucket_size = map.bucket_size(idx); if (bucket_size == 0) bucket_size = 1; count += bucket_size; } float load_factor = map.max_load_factor(); if (load_factor < 1.0) return count; return count * load_factor; } static const size_t unordered_map_per_entry_overhead = sizeof(void*); static const size_t unordered_map_bucket_overhead = sizeof(void*); public: size_t size() const { return map.size(); } // Estimate unordered_map memory usage. size_t sizeOf() const { return sizeof(*this) + (size() * (sizeof(TEntry) + unordered_map_per_entry_overhead)) + (bucket_size() * sizeof(size_t) + unordered_map_bucket_overhead); } typedef typename std::unordered_map<TKey, TEntry>::iterator iterator; typedef typename std::unordered_map<TKey, TEntry>::const_iterator const_iterator; Loading Loading @@ -155,6 +179,7 @@ public: } return output; } }; namespace EntryBaseConstants { Loading Loading @@ -472,7 +497,30 @@ class LogStatistics { // security tag list tagTable_t securityTagTable; size_t sizeOf() const { size_t size = sizeof(*this) + pidTable.sizeOf() + tidTable.sizeOf() + tagTable.sizeOf() + securityTagTable.sizeOf() + (pidTable.size() * sizeof(pidTable_t::iterator)) + (tagTable.size() * sizeof(tagTable_t::iterator)); for(auto it : pidTable) { const char* name = it.second.getName(); if (name) size += strlen(name) + 1; } for(auto it : tidTable) { const char* name = it.second.getName(); if (name) size += strlen(name) + 1; } log_id_for_each(id) { size += uidTable[id].sizeOf(); size += uidTable[id].size() * sizeof(uidTable_t::iterator); size += pidSystemTable[id].sizeOf(); size += pidSystemTable[id].size() * sizeof(pidSystemTable_t::iterator); } return size; } public: LogStatistics(); void enableStatistics() { enable = true; } Loading