diff options
author | Christopher Ferris <cferris@google.com> | 2019-05-02 18:33:11 -0700 |
---|---|---|
committer | Christopher Ferris <cferris@google.com> | 2019-05-03 14:15:12 +0000 |
commit | 125d32cb469d8e31f656543c3ad7b82154bc1689 (patch) | |
tree | a76e96cccf70fbea74aeda9b89c51dab58089b66 | |
parent | 58567dcd7837e7fe81f3235c32807185cb20a99d (diff) | |
download | android_bionic-125d32cb469d8e31f656543c3ad7b82154bc1689.tar.gz android_bionic-125d32cb469d8e31f656543c3ad7b82154bc1689.tar.bz2 android_bionic-125d32cb469d8e31f656543c3ad7b82154bc1689.zip |
Fix malloc_info missing large allocs.
Also change the names of some of the functions to make it very obvious
that the functions being called are in je code.
Write new test to make sure mallinfo and malloc_info match.
Bug: 131864803
Test: New unit tests pass (along with all other bionic unit tests).
Change-Id: I26eda7e64f57a8c56cc8d70e3ed6a29dcb87f630
-rw-r--r-- | libc/bionic/jemalloc_wrapper.cpp | 16 | ||||
-rw-r--r-- | tests/malloc_test.cpp | 54 |
2 files changed, 62 insertions, 8 deletions
diff --git a/libc/bionic/jemalloc_wrapper.cpp b/libc/bionic/jemalloc_wrapper.cpp index fd99814a6..bf0494dde 100644 --- a/libc/bionic/jemalloc_wrapper.cpp +++ b/libc/bionic/jemalloc_wrapper.cpp @@ -128,10 +128,10 @@ int je_mallopt(int param, int value) { __BEGIN_DECLS -size_t __mallinfo_narenas(); -size_t __mallinfo_nbins(); -struct mallinfo __mallinfo_arena_info(size_t); -struct mallinfo __mallinfo_bin_info(size_t, size_t); +size_t je_mallinfo_narenas(); +size_t je_mallinfo_nbins(); +struct mallinfo je_mallinfo_arena_info(size_t); +struct mallinfo je_mallinfo_bin_info(size_t, size_t); __END_DECLS @@ -144,8 +144,8 @@ int je_malloc_info(int options, FILE* fp) { MallocXmlElem root(fp, "malloc", "version=\"jemalloc-1\""); // Dump all of the large allocations in the arenas. - for (size_t i = 0; i < __mallinfo_narenas(); i++) { - struct mallinfo mi = __mallinfo_arena_info(i); + for (size_t i = 0; i < je_mallinfo_narenas(); i++) { + struct mallinfo mi = je_mallinfo_arena_info(i); if (mi.hblkhd != 0) { MallocXmlElem arena_elem(fp, "heap", "nr=\"%d\"", i); { @@ -154,8 +154,8 @@ int je_malloc_info(int options, FILE* fp) { MallocXmlElem(fp, "allocated-bins").Contents("%zu", mi.fsmblks); size_t total = 0; - for (size_t j = 0; j < __mallinfo_nbins(); j++) { - struct mallinfo mi = __mallinfo_bin_info(i, j); + for (size_t j = 0; j < je_mallinfo_nbins(); j++) { + struct mallinfo mi = je_mallinfo_bin_info(i, j); if (mi.ordblks != 0) { MallocXmlElem bin_elem(fp, "bin", "nr=\"%d\"", j); MallocXmlElem(fp, "allocated").Contents("%zu", mi.ordblks); diff --git a/tests/malloc_test.cpp b/tests/malloc_test.cpp index 706de15db..983592f0a 100644 --- a/tests/malloc_test.cpp +++ b/tests/malloc_test.cpp @@ -395,6 +395,60 @@ TEST(malloc, malloc_info) { #endif } +TEST(malloc, malloc_info_matches_mallinfo) { +#ifdef __BIONIC__ + SKIP_WITH_HWASAN; // hwasan does not implement malloc_info + + char* buf; + size_t bufsize; + FILE* memstream = open_memstream(&buf, &bufsize); + ASSERT_NE(nullptr, memstream); + size_t mallinfo_before_allocated_bytes = mallinfo().uordblks; + ASSERT_EQ(0, malloc_info(0, memstream)); + size_t mallinfo_after_allocated_bytes = mallinfo().uordblks; + ASSERT_EQ(0, fclose(memstream)); + + tinyxml2::XMLDocument doc; + ASSERT_EQ(tinyxml2::XML_SUCCESS, doc.Parse(buf)); + + size_t total_allocated_bytes = 0; + auto root = doc.FirstChildElement(); + ASSERT_NE(nullptr, root); + ASSERT_STREQ("malloc", root->Name()); + if (std::string(root->Attribute("version")) == "jemalloc-1") { + // Verify jemalloc version of this data. + ASSERT_STREQ("jemalloc-1", root->Attribute("version")); + + auto arena = root->FirstChildElement(); + for (; arena != nullptr; arena = arena->NextSiblingElement()) { + int val; + + ASSERT_STREQ("heap", arena->Name()); + ASSERT_EQ(tinyxml2::XML_SUCCESS, arena->QueryIntAttribute("nr", &val)); + ASSERT_EQ(tinyxml2::XML_SUCCESS, + arena->FirstChildElement("allocated-large")->QueryIntText(&val)); + total_allocated_bytes += val; + ASSERT_EQ(tinyxml2::XML_SUCCESS, + arena->FirstChildElement("allocated-huge")->QueryIntText(&val)); + total_allocated_bytes += val; + ASSERT_EQ(tinyxml2::XML_SUCCESS, + arena->FirstChildElement("allocated-bins")->QueryIntText(&val)); + total_allocated_bytes += val; + ASSERT_EQ(tinyxml2::XML_SUCCESS, + arena->FirstChildElement("bins-total")->QueryIntText(&val)); + } + // The total needs to be between the mallinfo call before and after + // since malloc_info allocates some memory. + EXPECT_LE(mallinfo_before_allocated_bytes, total_allocated_bytes); + EXPECT_GE(mallinfo_after_allocated_bytes, total_allocated_bytes); + } else { + // Only verify that this is debug-malloc-1, the malloc debug unit tests + // verify the output. + ASSERT_STREQ("debug-malloc-1", root->Attribute("version")); + } +#endif +} + TEST(malloc, calloc_usable_size) { for (size_t size = 1; size <= 2048; size++) { void* pointer = malloc(size); |