Avoid clearing uncommitted mark array (#83623)
authorAndrew Au <andrewau@microsoft.com>
Wed, 5 Apr 2023 17:35:59 +0000 (10:35 -0700)
committerGitHub <noreply@github.com>
Wed, 5 Apr 2023 17:35:59 +0000 (10:35 -0700)
src/coreclr/gc/gc.cpp
src/coreclr/gc/gcpriv.h
src/tests/GC/API/Frozen/Frozen.cs

index a85d28eb6a7396a1803692a24a2ee1e36cad7146..5f4821091545f01edeeff01130758d0e8d686418 100644 (file)
@@ -8523,14 +8523,9 @@ uint32_t* translate_mark_array (uint32_t* ma)
 
 #ifdef FEATURE_BASICFREEZE
 // end must be page aligned addresses.
-void gc_heap::clear_mark_array (uint8_t* from, uint8_t* end, BOOL read_only/*=FALSE*/)
+void gc_heap::clear_mark_array (uint8_t* from, uint8_t* end)
 {
     assert (gc_can_use_concurrent);
-
-    if (!read_only)
-    {
-        assert (from == align_on_mark_word (from));
-    }
     assert (end == align_on_mark_word (end));
 
     uint8_t* current_lowest_address = background_saved_lowest_address;
@@ -9595,8 +9590,7 @@ void gc_heap::remove_ro_segment (heap_segment* seg)
 #ifdef BACKGROUND_GC
     if (gc_can_use_concurrent)
     {
-        clear_mark_array (align_lower_mark_word (max (heap_segment_mem (seg), lowest_address)),
-                          align_on_card_word (min (heap_segment_allocated (seg), highest_address)));
+        seg_clear_mark_array_bits_soh (seg);
     }
 #endif //BACKGROUND_GC
 
@@ -11084,7 +11078,7 @@ void gc_heap::seg_clear_mark_array_bits_soh (heap_segment* seg)
     uint8_t* range_end = 0;
     if (bgc_mark_array_range (seg, FALSE, &range_beg, &range_end))
     {
-        clear_mark_array (range_beg, align_on_mark_word (range_end), TRUE);
+        clear_mark_array (range_beg, align_on_mark_word (range_end));
     }
 }
 
index da50b85e971aefb848ef89c8af9827a12cb53c76..7f1ce9b9bf5afec1c18cc576006afb82e9fd9474 100644 (file)
@@ -2284,7 +2284,7 @@ private:
 
 #ifdef FEATURE_BASICFREEZE
     PER_HEAP_METHOD void seg_set_mark_array_bits_soh (heap_segment* seg);
-    PER_HEAP_METHOD void clear_mark_array (uint8_t* from, uint8_t* end, BOOL read_only=FALSE);
+    PER_HEAP_METHOD void clear_mark_array (uint8_t* from, uint8_t* end);
     PER_HEAP_METHOD void seg_clear_mark_array_bits_soh (heap_segment* seg);
 #endif // FEATURE_BASICFREEZE
 
index ef63f612422e902857b5652fdca54917b59cfbf6..ebeed597472c91400c3f1277b22b69bfd5fb5962 100644 (file)
@@ -136,6 +136,13 @@ namespace HelloFrozenSegment
     {
         private static unsafe int Main()
         {
+            // Regression testing for dotnet/runtime #83027
+            Node[] firstArray = new Node[30000000]; 
+            for (int index = 0; index < firstArray.Length; index++)
+            {
+                firstArray[index] = new Node();
+            }
+
             IntPtr methodTable = typeof(Node).TypeHandle.Value;
 
             FrozenSegmentBuilder frozenSegmentBuilder = new FrozenSegmentBuilder(1000);