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;