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));
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, §ion->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;
+ }
}