aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristopher Ferris <cferris@google.com>2019-05-02 18:33:11 -0700
committerChristopher Ferris <cferris@google.com>2019-05-03 14:15:12 +0000
commit125d32cb469d8e31f656543c3ad7b82154bc1689 (patch)
treea76e96cccf70fbea74aeda9b89c51dab58089b66
parent58567dcd7837e7fe81f3235c32807185cb20a99d (diff)
downloadandroid_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.cpp16
-rw-r--r--tests/malloc_test.cpp54
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);