Merge "Fix questionable behavior for the bulk region clearing"
diff --git a/runtime/gc/space/region_space.cc b/runtime/gc/space/region_space.cc
index 1f7bd09..b8f1e8f 100644
--- a/runtime/gc/space/region_space.cc
+++ b/runtime/gc/space/region_space.cc
@@ -251,6 +251,13 @@
evac_region_ = &full_region_;
}
+static void ZeroAndProtectRegion(uint8_t* begin, uint8_t* end) {
+ ZeroAndReleasePages(begin, end - begin);
+ if (kProtectClearedRegions) {
+ mprotect(begin, end - begin, PROT_NONE);
+ }
+}
+
void RegionSpace::ClearFromSpace(uint64_t* cleared_bytes, uint64_t* cleared_objects) {
DCHECK(cleared_bytes != nullptr);
DCHECK(cleared_objects != nullptr);
@@ -269,7 +276,7 @@
auto clear_region = [&clear_block_begin, &clear_block_end](Region* r) {
r->Clear(/*zero_and_release_pages*/false);
if (clear_block_end != r->Begin()) {
- ZeroAndReleasePages(clear_block_begin, clear_block_end - clear_block_begin);
+ ZeroAndProtectRegion(clear_block_begin, clear_block_end);
clear_block_begin = r->Begin();
}
clear_block_end = r->End();
@@ -548,10 +555,7 @@
alloc_time_ = 0;
live_bytes_ = static_cast<size_t>(-1);
if (zero_and_release_pages) {
- ZeroAndReleasePages(begin_, end_ - begin_);
- }
- if (kProtectClearedRegions) {
- mprotect(begin_, end_ - begin_, PROT_NONE);
+ ZeroAndProtectRegion(begin_, end_);
}
is_newly_allocated_ = false;
is_a_tlab_ = false;