[boehm] Fix memory management for toggleref.
authorRodrigo Kumpera <kumpera@gmail.com>
Thu, 13 Mar 2014 22:47:26 +0000 (18:47 -0400)
committerRodrigo Kumpera <kumpera@gmail.com>
Thu, 13 Mar 2014 22:47:26 +0000 (18:47 -0400)
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.

libgc/finalize.c

index fd133ae4b115a1f84aa6b5f4952301c066d44d32..91f6970180cd26352a864464a0ac44184d2a07ce 100644 (file)
@@ -386,7 +386,7 @@ static void GC_mark_togglerefs ()
        if (!GC_toggleref_array)
                return;
 
-       GC_set_mark_bit (GC_toggleref_array);
+       GC_set_mark_bit ((GC_PTR)GC_toggleref_array);
        for (i = 0; i < GC_toggleref_array_size; ++i) {
                if (GC_toggleref_array [i].strong_ref) {
                        GC_PTR object = GC_toggleref_array [i].strong_ref;
@@ -424,7 +424,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;
@@ -432,10 +432,9 @@ 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;
        }
 }