Improve memunreachable ABI before making it vendor_available

vendor_available: true means that some prebuilts will end up with
references to classes defined in memunreachable.h.  Add version
numbers and reserved fields to the classes and default initialize
everything to zero.

Bug: 132302484
Test: memunreachable_unit_test
Change-Id: Ic183fcc766acd2c4c7dc62efafcc2c75a636e407
This commit is contained in:
Colin Cross 2019-05-20 12:55:33 -07:00
parent 6efb8e7754
commit 025ed8aacd
3 changed files with 37 additions and 16 deletions

View File

@ -280,6 +280,12 @@ static inline const char* plural(T val) {
}
bool GetUnreachableMemory(UnreachableMemoryInfo& info, size_t limit) {
if (info.version > 0) {
MEM_ALOGE("unsupported UnreachableMemoryInfo.version %zu in GetUnreachableMemory",
info.version);
return false;
}
int parent_pid = getpid();
int parent_tid = gettid();

View File

@ -28,38 +28,45 @@
namespace android {
struct Leak {
uintptr_t begin;
size_t size;
uintptr_t begin = 0;
size_t size = 0;
size_t referenced_count;
size_t referenced_size;
size_t referenced_count = 0;
size_t referenced_size = 0;
size_t similar_count;
size_t similar_size;
size_t similar_referenced_count;
size_t similar_referenced_size;
size_t similar_count = 0;
size_t similar_size = 0;
size_t similar_referenced_count = 0;
size_t similar_referenced_size = 0;
size_t total_size;
size_t total_size = 0;
static const size_t contents_length = 32;
char contents[contents_length];
char contents[contents_length] = {};
struct Backtrace {
size_t num_frames;
size_t num_frames = 0;
static const size_t max_frames = 16;
uintptr_t frames[max_frames];
uintptr_t frames[max_frames] = {};
size_t reserved[8] = {};
} backtrace;
size_t reserved[8] = {};
std::string ToString(bool log_contents) const;
};
struct UnreachableMemoryInfo {
std::vector<Leak> leaks;
size_t num_leaks;
size_t leak_bytes;
size_t num_allocations;
size_t allocation_bytes;
size_t num_leaks = 0;
size_t leak_bytes = 0;
size_t num_allocations = 0;
size_t allocation_bytes = 0;
size_t version = 0; // Must be 0
size_t reserved[8] = {};
UnreachableMemoryInfo() {}
~UnreachableMemoryInfo();

View File

@ -264,4 +264,12 @@ TEST_F(MemunreachableTest, leak_lots) {
ASSERT_TRUE(LogUnreachableMemory(true, 100));
}
TEST_F(MemunreachableTest, version) {
UnreachableMemoryInfo info;
info.version = 1;
ASSERT_FALSE(GetUnreachableMemory(info));
ASSERT_EQ(0U, info.leaks.size());
}
} // namespace android