]> granicus.if.org Git - gc/commitdiff
Fix memory management for toggle-ref
authorRodrigo Kumpera <kumpera@gmail.com>
Thu, 13 Mar 2014 22:47:26 +0000 (18:47 -0400)
committerIvan Maidanski <ivmai@mail.ru>
Wed, 26 Aug 2015 20:19:59 +0000 (23:19 +0300)
(Apply commit 960f233 from 'mono_libgc' branch.)

Replace GC_free with GC_INTERNAL_FREE. The former might take the GC lock
and deadlock us.

Replace GC_INTERNAL_MALLOC with GC_INTERNAL_MALLOC_IGNORE_OFF_PAGE as
we don't need the rest of the GC messing around with the toggleref array.

finalize.c

index f58d220164bef98467c9eb7266125c5584d986a4..f57bf55eb803b39bc189339efb9579d88708778e 100644 (file)
@@ -377,7 +377,7 @@ ensure_toggleref_capacity (int capacity)
 {
     if (!GC_toggleref_array) {
         GC_toggleref_array_capacity = 32;
-        GC_toggleref_array = (GCToggleRef *) GC_INTERNAL_MALLOC (GC_toggleref_array_capacity * sizeof (GCToggleRef), NORMAL);
+        GC_toggleref_array = (GCToggleRef *) GC_INTERNAL_MALLOC_IGNORE_OFF_PAGE (GC_toggleref_array_capacity * sizeof (GCToggleRef), NORMAL);
     }
     if (GC_toggleref_array_size + capacity >= GC_toggleref_array_capacity) {
         GCToggleRef *tmp;
@@ -385,10 +385,10 @@ ensure_toggleref_capacity (int capacity)
         while (GC_toggleref_array_capacity < GC_toggleref_array_size + capacity)
             GC_toggleref_array_capacity *= 2;
 
-        tmp = (GCToggleRef *) GC_INTERNAL_MALLOC (GC_toggleref_array_capacity * sizeof (GCToggleRef), NORMAL);
+        tmp = (GCToggleRef *) GC_INTERNAL_MALLOC_IGNORE_OFF_PAGE (GC_toggleref_array_capacity * sizeof (GCToggleRef), NORMAL);
         memcpy (tmp, GC_toggleref_array, GC_toggleref_array_size * sizeof (GCToggleRef));
 
-        GC_free((GC_PTR)GC_toggleref_array);
+        GC_INTERNAL_FREE(GC_toggleref_array);
         GC_toggleref_array = tmp;
     }
 }