diff --git a/logd/LogStatistics.cpp b/logd/LogStatistics.cpp index d68bfee99..d4b48ef9b 100644 --- a/logd/LogStatistics.cpp +++ b/logd/LogStatistics.cpp @@ -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); diff --git a/logd/LogStatistics.h b/logd/LogStatistics.h index bfaafa461..1f598af8a 100644 --- a/logd/LogStatistics.h +++ b/logd/LogStatistics.h @@ -42,8 +42,32 @@ class LogHashtable { std::unordered_map 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::iterator iterator; typedef typename std::unordered_map::const_iterator const_iterator; @@ -155,6 +179,7 @@ public: } return output; } + }; namespace EntryBaseConstants { @@ -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; }