+
+static G_GNUC_UNUSED void
+print_nursery_gaps (void* start_nursery, void *end_nursery)
+{
+ int i;
+ gpointer first = start_nursery;
+ gpointer next;
+ for (i = 0; i < next_pin_slot; ++i) {
+ next = pin_queue [i];
+ fprintf (gc_debug_file, "Nursery range: %p-%p, size: %td\n", first, next, (char*)next-(char*)first);
+ first = next;
+ }
+ next = end_nursery;
+ fprintf (gc_debug_file, "Nursery range: %p-%p, size: %td\n", first, next, (char*)next-(char*)first);
+}
+
+/* reduce the info in the pin queue, removing duplicate pointers and sorting them */
+void
+sgen_optimize_pin_queue (int start_slot)
+{
+ void **start, **cur, **end;
+ /* sort and uniq pin_queue: we just sort and we let the rest discard multiple values */
+ /* it may be better to keep ranges of pinned memory instead of individually pinning objects */
+ DEBUG (5, fprintf (gc_debug_file, "Sorting pin queue, size: %d\n", next_pin_slot));
+ if ((next_pin_slot - start_slot) > 1)
+ sgen_sort_addresses (pin_queue + start_slot, next_pin_slot - start_slot);
+ start = cur = pin_queue + start_slot;
+ end = pin_queue + next_pin_slot;
+ while (cur < end) {
+ *start = *cur++;
+ while (*start == *cur && cur < end)
+ cur++;
+ start++;
+ };
+ next_pin_slot = start - pin_queue;
+ DEBUG (5, fprintf (gc_debug_file, "Pin queue reduced to size: %d\n", next_pin_slot));
+ //DEBUG (6, print_nursery_gaps (start_nursery, end_nursery));
+}
+
+int
+sgen_get_pinned_count (void)
+{
+ return next_pin_slot;
+}
+
+void
+sgen_dump_pin_queue (void)
+{
+ int i;
+
+ for (i = 0; i < last_num_pinned; ++i) {
+ DEBUG (3, fprintf (gc_debug_file, "Bastard pinning obj %p (%s), size: %d\n", pin_queue [i], sgen_safe_name (pin_queue [i]), sgen_safe_object_get_size (pin_queue [i])));
+ }
+}
+
+#endif /* HAVE_SGEN_GC */