summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandroid-build-team Robot <android-build-team-robot@google.com>2020-03-21 02:15:42 +0000
committerandroid-build-team Robot <android-build-team-robot@google.com>2020-03-21 02:15:42 +0000
commit93772f58ed9a7b5fe4bc5c20a9aa76486734e241 (patch)
tree4d332b77cd1bcd8d692c083b29306cd5e6a1ef15
parentfa6b937ea569689e2067f58d8b4216d55890f7f9 (diff)
parent01727940b431ed42f6dbd79ac798f3b31b53050c (diff)
downloadscudo-93772f58ed9a7b5fe4bc5c20a9aa76486734e241.tar.gz
Snap for 6318629 from 01727940b431ed42f6dbd79ac798f3b31b53050c to rvc-d1-release
Change-Id: Iff03ce9886c620e4b3926fc7ba94ec40d5d16905
-rw-r--r--standalone/combined.h21
-rw-r--r--standalone/tests/combined_test.cpp31
2 files changed, 25 insertions, 27 deletions
diff --git a/standalone/combined.h b/standalone/combined.h
index 8456dc82d20..1aa93510d22 100644
--- a/standalone/combined.h
+++ b/standalone/combined.h
@@ -260,8 +260,8 @@ public:
}
DCHECK_LE(Size, NeededSize);
- void *Block;
- uptr ClassId;
+ void *Block = nullptr;
+ uptr ClassId = 0;
uptr SecondaryBlockEnd;
if (LIKELY(PrimaryT::canAllocate(NeededSize))) {
ClassId = SizeClassMap::getClassIdBySize(NeededSize);
@@ -273,20 +273,19 @@ public:
// is the region being full. In that event, retry once using the
// immediately larger class (except if the failing class was already the
// largest). This will waste some memory but will allow the application to
- // not fail.
- if (SCUDO_ANDROID) {
- if (UNLIKELY(!Block)) {
- if (ClassId < SizeClassMap::LargestClassId)
- Block = TSD->Cache.allocate(++ClassId);
- }
+ // not fail. If dealing with the largest class, fallback to the Secondary.
+ if (UNLIKELY(!Block)) {
+ if (ClassId < SizeClassMap::LargestClassId)
+ Block = TSD->Cache.allocate(++ClassId);
+ else
+ ClassId = 0;
}
if (UnlockRequired)
TSD->unlock();
- } else {
- ClassId = 0;
+ }
+ if (UNLIKELY(ClassId == 0))
Block = Secondary.allocate(NeededSize, Alignment, &SecondaryBlockEnd,
ZeroContents);
- }
if (UNLIKELY(!Block)) {
if (Options.MayReturnNull)
diff --git a/standalone/tests/combined_test.cpp b/standalone/tests/combined_test.cpp
index ce1b2824788..a6f29a2610e 100644
--- a/standalone/tests/combined_test.cpp
+++ b/standalone/tests/combined_test.cpp
@@ -417,7 +417,7 @@ TEST(ScudoCombinedTest, ReleaseToOS) {
Allocator->releaseToOS();
}
-// Verify that when a region gets full, Android will still manage to
+// Verify that when a region gets full, the allocator will still manage to
// fulfill the allocation through a larger size class.
TEST(ScudoCombinedTest, FullRegion) {
using AllocatorT = scudo::Allocator<DeathConfig>;
@@ -429,26 +429,25 @@ TEST(ScudoCombinedTest, FullRegion) {
Deleter);
Allocator->reset();
- const scudo::uptr Size = 1000U;
- const scudo::uptr MaxNumberOfChunks =
- (1U << DeathRegionSizeLog) /
- DeathConfig::DeathSizeClassMap::getSizeByClassId(1U);
- void *P;
std::vector<void *> V;
scudo::uptr FailedAllocationsCount = 0;
- for (scudo::uptr I = 0; I <= MaxNumberOfChunks; I++) {
- P = Allocator->allocate(Size, Origin);
- if (!P)
- FailedAllocationsCount++;
- else
- V.push_back(P);
+ for (scudo::uptr ClassId = 1U;
+ ClassId <= DeathConfig::DeathSizeClassMap::LargestClassId; ClassId++) {
+ const scudo::uptr Size =
+ DeathConfig::DeathSizeClassMap::getSizeByClassId(ClassId);
+ const scudo::uptr MaxNumberOfChunks = (1U << DeathRegionSizeLog) / Size;
+ void *P;
+ for (scudo::uptr I = 0; I <= MaxNumberOfChunks; I++) {
+ P = Allocator->allocate(Size - 64U, Origin);
+ if (!P)
+ FailedAllocationsCount++;
+ else
+ V.push_back(P);
+ }
}
while (!V.empty()) {
Allocator->deallocate(V.back(), Origin);
V.pop_back();
}
- if (SCUDO_ANDROID)
- EXPECT_EQ(FailedAllocationsCount, 0U);
- else
- EXPECT_GT(FailedAllocationsCount, 0U);
+ EXPECT_EQ(FailedAllocationsCount, 0U);
}