Merge "Add support for new scudo mallopt options."
This commit is contained in:
commit
3025f128f3
2 changed files with 62 additions and 0 deletions
|
@ -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
|
||||
|
|
|
@ -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".
|
||||
|
|
Loading…
Reference in a new issue