Make the var/mvar caches per-image, since the generic params they refer to can be...
[mono.git] / mono / metadata / sgen-pinning.c
index 9c0b051efc7fff08f90062fed92affef66159002..bd28cdfd0b4e5403c057af5ee7ab722620fe950d 100644 (file)
@@ -40,9 +40,9 @@ static void
 realloc_pin_queue (void)
 {
        int new_size = pin_queue_size? pin_queue_size + pin_queue_size/2: 1024;
-       void **new_pin = mono_sgen_alloc_internal (sizeof (void*) * new_size, INTERNAL_MEM_PIN_QUEUE);
+       void **new_pin = mono_sgen_alloc_internal_dynamic (sizeof (void*) * new_size, INTERNAL_MEM_PIN_QUEUE);
        memcpy (new_pin, pin_queue, sizeof (void*) * next_pin_slot);
-       mono_sgen_free_internal (pin_queue, INTERNAL_MEM_PIN_QUEUE);
+       mono_sgen_free_internal_dynamic (pin_queue, sizeof (void*) * pin_queue_size, INTERNAL_MEM_PIN_QUEUE);
        pin_queue = new_pin;
        pin_queue_size = new_size;
        DEBUG (4, fprintf (gc_debug_file, "Reallocated pin queue to size: %d\n", new_size));
@@ -106,21 +106,37 @@ optimized_pin_queue_search (void *addr)
        return first;
 }
 
-static void
-find_optimized_pin_queue_area (void *start, void *end, int *first, int *last)
+void**
+mono_sgen_find_optimized_pin_queue_area (void *start, void *end, int *num)
 {
-       *first = optimized_pin_queue_search (start);
-       *last = optimized_pin_queue_search (end);
+       int first, last;
+       first = optimized_pin_queue_search (start);
+       last = optimized_pin_queue_search (end);
+       *num = last - first;
+       if (first == last)
+               return NULL;
+       return pin_queue + first;
 }
 
-static void
-find_section_pin_queue_start_end (GCMemSection *section)
+void
+mono_sgen_find_section_pin_queue_start_end (GCMemSection *section)
 {
-       int start, end;
        DEBUG (6, fprintf (gc_debug_file, "Pinning from section %p (%p-%p)\n", section, section->data, section->end_data));
-       find_optimized_pin_queue_area (section->data, section->end_data, &start, &end);
-       DEBUG (6, fprintf (gc_debug_file, "Found %d pinning addresses in section %p (%d-%d)\n",
-                                       end - start, section, start, end));
-       section->pin_queue_start = start;
-       section->pin_queue_end = end;
+       section->pin_queue_start = mono_sgen_find_optimized_pin_queue_area (section->data, section->end_data, &section->pin_queue_num_entries);
+       DEBUG (6, fprintf (gc_debug_file, "Found %d pinning addresses in section %p\n", section->pin_queue_num_entries, section));
+}
+
+static void
+mono_sgen_pin_queue_clear_discarded_entries (GCMemSection *section, int max_pin_slot)
+{
+       void **start = section->pin_queue_start + section->pin_queue_num_entries;
+       void **end = pin_queue + max_pin_slot;
+       void *addr;
+
+       for (; start < end; ++start) {
+               addr = *start;
+               if ((char*)addr < section->data || (char*)addr > section->end_data)
+                       break;
+               *start = NULL;
+       }
 }