diff options
author | Christopher Ferris <cferris@google.com> | 2019-05-03 07:34:52 -0700 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2019-05-03 07:34:52 -0700 |
commit | 6992bc480c274a0b536635455906368e9f707ed2 (patch) | |
tree | a76e96cccf70fbea74aeda9b89c51dab58089b66 | |
parent | a5b6f60083ef4571818dbfda6da720aa19775ffa (diff) | |
parent | 125d32cb469d8e31f656543c3ad7b82154bc1689 (diff) | |
download | android_bionic-6992bc480c274a0b536635455906368e9f707ed2.tar.gz android_bionic-6992bc480c274a0b536635455906368e9f707ed2.tar.bz2 android_bionic-6992bc480c274a0b536635455906368e9f707ed2.zip |
Fix malloc_info missing large allocs.
am: 125d32cb46
Change-Id: I4c971ef382f835fc0a308487d167c45b7414e119
-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); |