aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Ferris <cferris@google.com>2020-07-28 14:15:31 -0700
committerChristopher Ferris <cferris@google.com>2020-08-03 21:15:54 +0000
commit44f0faa247d9345bfd94472ee7d6b003f4c7864e (patch)
tree5716dfc9cf52fc2e12bd3969df8c76f992c9fe27
parent4f4ad63a64ac06b88fa64826f785c6b70bd1168a (diff)
downloadbionic-44f0faa247d9345bfd94472ee7d6b003f4c7864e.tar.gz
Add support for new scudo mallopt options.
Bug: 162092537 Test: Ran new unit tests. Change-Id: I4b7d17a9e98166c03cd153eb9e9d847693914ea3 Merged-In: I4b7d17a9e98166c03cd153eb9e9d847693914ea3 (cherry picked from commit 8844879212852a70918df1c9ebcac4d574f1fcd9)
-rw-r--r--libc/include/malloc.h22
-rw-r--r--tests/malloc_test.cpp40
2 files changed, 62 insertions, 0 deletions
diff --git a/libc/include/malloc.h b/libc/include/malloc.h
index ba0af3ca3..833fa59b5 100644
--- a/libc/include/malloc.h
+++ b/libc/include/malloc.h
@@ -170,6 +170,28 @@ int malloc_info(int __must_be_zero, FILE* __fp) __INTRODUCED_IN(23);
* Available since API level 28.
*/
#define M_PURGE (-101)
+/**
+ * mallopt() option to set the maximum number of items in the secondary
+ * cache of the scudo allocator.
+ *
+ * Available since API level 31.
+ */
+#define M_CACHE_COUNT_MAX (-200)
+/**
+ * mallopt() option to set the maximum size in bytes of a cacheable item in
+ * the secondary cache of the scudo allocator.
+ *
+ * Available since API level 31.
+ */
+#define M_CACHE_SIZE_MAX (-201)
+/**
+ * mallopt() option to increase the maximum number of shared thread-specific
+ * data structures that can be created. This number cannot be decreased,
+ * only increased and only applies to the scudo allocator.
+ *
+ * Available since API level 31.
+ */
+#define M_TSDS_COUNT_MAX (-202)
/**
* [mallopt(3)](http://man7.org/linux/man-pages/man3/mallopt.3.html) modifies
diff --git a/tests/malloc_test.cpp b/tests/malloc_test.cpp
index 594441487..bd0daddbd 100644
--- a/tests/malloc_test.cpp
+++ b/tests/malloc_test.cpp
@@ -662,6 +662,46 @@ TEST(malloc, mallopt_purge) {
#endif
}
+#if defined(__BIONIC__)
+static void GetAllocatorVersion(bool* allocator_scudo) {
+ TemporaryFile tf;
+ ASSERT_TRUE(tf.fd != -1);
+ FILE* fp = fdopen(tf.fd, "w+");
+ tf.release();
+ ASSERT_TRUE(fp != nullptr);
+ ASSERT_EQ(0, malloc_info(0, fp));
+ ASSERT_EQ(0, fclose(fp));
+
+ std::string contents;
+ ASSERT_TRUE(android::base::ReadFileToString(tf.path, &contents));
+
+ tinyxml2::XMLDocument doc;
+ ASSERT_EQ(tinyxml2::XML_SUCCESS, doc.Parse(contents.c_str()));
+
+ auto root = doc.FirstChildElement();
+ ASSERT_NE(nullptr, root);
+ ASSERT_STREQ("malloc", root->Name());
+ std::string version(root->Attribute("version"));
+ *allocator_scudo = (version == "scudo-1");
+}
+#endif
+
+TEST(malloc, mallopt_scudo_only_options) {
+#if defined(__BIONIC__)
+ SKIP_WITH_HWASAN << "hwasan does not implement mallopt";
+ bool allocator_scudo;
+ GetAllocatorVersion(&allocator_scudo);
+ if (!allocator_scudo) {
+ GTEST_SKIP() << "scudo allocator only test";
+ }
+ ASSERT_EQ(1, mallopt(M_CACHE_COUNT_MAX, 100));
+ ASSERT_EQ(1, mallopt(M_CACHE_SIZE_MAX, 1024 * 1024 * 2));
+ ASSERT_EQ(1, mallopt(M_TSDS_COUNT_MAX, 8));
+#else
+ GTEST_SKIP() << "bionic-only test";
+#endif
+}
+
TEST(malloc, reallocarray_overflow) {
#if HAVE_REALLOCARRAY
// Values that cause overflow to a result small enough (8 on LP64) that malloc would "succeed".