#ifdef HAVE_SGEN_GC
#include "utils/mono-counters.h"
-#include "metadata/object-internals.h"
-#include "metadata/profiler-private.h"
#include "metadata/sgen-gc.h"
#include "metadata/sgen-protocol.h"
#include "metadata/mono-gc.h"
+#include "metadata/object-internals.h"
+#include "metadata/profiler-private.h"
#define MAJOR_SECTION_SIZE SGEN_PINNED_CHUNK_SIZE
#define BLOCK_FOR_OBJECT(o) SGEN_PINNED_CHUNK_FOR_PTR ((o))
static GCMemSection *section_list = NULL;
-static SgenInternalAllocator pinned_allocator;
+static SgenPinnedAllocator pinned_allocator;
+
+static gboolean have_swept;
/*
* used when moving the objects
static void
free_pinned_object (char *obj, size_t size)
{
- mono_sgen_free_internal_full (&pinned_allocator, obj, size, INTERNAL_MEM_MANAGED);
+ mono_sgen_free_pinned (&pinned_allocator, obj, size);
}
/*
section->size = MAJOR_SECTION_SIZE - SGEN_SIZEOF_GC_MEM_SECTION;
section->end_data = section->data + section->size;
mono_sgen_update_heap_boundaries ((mword)section->data, (mword)section->end_data);
- DEBUG (3, fprintf (gc_debug_file, "New major heap section: (%p-%p), total: %zd\n", section->data, section->end_data, mono_gc_get_heap_size ()));
+ DEBUG (3, fprintf (gc_debug_file, "New major heap section: (%p-%p), total: %jd\n", section->data, section->end_data, mono_gc_get_heap_size ()));
scan_starts = (section->size + SGEN_SCAN_START_SIZE - 1) / SGEN_SCAN_START_SIZE;
section->scan_starts = mono_sgen_alloc_internal_dynamic (sizeof (char*) * scan_starts, INTERNAL_MEM_SCAN_STARTS);
section->num_scan_start = scan_starts;
static void*
major_alloc_small_pinned_obj (size_t size, gboolean has_references)
{
- return mono_sgen_alloc_internal_full (&pinned_allocator, size, INTERNAL_MEM_MANAGED);
+ return mono_sgen_alloc_pinned (&pinned_allocator, size);
}
/*
static void
sweep_pinned_objects (void)
{
- mono_sgen_internal_scan_objects (&pinned_allocator, sweep_pinned_objects_callback, NULL);
+ mono_sgen_pinned_scan_objects (&pinned_allocator, sweep_pinned_objects_callback, NULL);
}
static void
if (non_pinned) {
GCMemSection *section;
for (section = section_list; section; section = section->block.next)
- mono_sgen_scan_area_with_callback (section->data, section->end_data, callback, data);
+ mono_sgen_scan_area_with_callback (section->data, section->end_data, callback, data, FALSE);
}
if (pinned)
- mono_sgen_internal_scan_objects (&pinned_allocator, callback, data);
+ mono_sgen_pinned_scan_objects (&pinned_allocator, callback, data);
}
static void
for (section = section_list; section; section = section->block.next)
mono_sgen_find_section_pin_queue_start_end (section);
- mono_sgen_internal_scan_pinned_objects (&pinned_allocator, (IterateObjectCallbackFunc)pin_pinned_object_callback, queue);
+ mono_sgen_pinned_scan_pinned_objects (&pinned_allocator, (IterateObjectCallbackFunc)pin_pinned_object_callback, queue);
}
static void
/* unpin objects from the pinned chunks and free the unmarked ones */
sweep_pinned_objects ();
- mono_sgen_internal_update_heap_boundaries (&pinned_allocator);
+ mono_sgen_pinned_update_heap_boundaries (&pinned_allocator);
/* free the unused sections */
prev_section = NULL;
update:
mono_sgen_update_heap_boundaries ((mword)this_section->data, (mword)this_section->data + this_section->size);
}
+
+ have_swept = TRUE;
}
static void
static void
major_report_pinned_memory_usage (void)
{
- mono_sgen_report_internal_mem_usage_full (&pinned_allocator);
+ mono_sgen_report_pinned_mem_usage (&pinned_allocator);
}
static int
collector->supports_cardtable = FALSE;
collector->is_parallel = FALSE;
+ collector->have_swept = &have_swept;
+
collector->alloc_heap = major_alloc_heap;
collector->is_object_live = major_is_object_live;
collector->alloc_small_pinned_obj = major_alloc_small_pinned_obj;