X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fsgen-nursery-allocator.c;h=408703ccfaf4df7d4e6ba40b76c6682dc6fa051b;hb=4c43884a5975e3aace6f28d7175f0a699ac8396e;hp=01d1bd1a7960cc908c2da78769993a689e53e529;hpb=dacc3f8c5d4331f7a40413f3a802ec4049da1e2e;p=mono.git diff --git a/mono/metadata/sgen-nursery-allocator.c b/mono/metadata/sgen-nursery-allocator.c index 01d1bd1a796..408703ccfaf 100644 --- a/mono/metadata/sgen-nursery-allocator.c +++ b/mono/metadata/sgen-nursery-allocator.c @@ -50,7 +50,6 @@ #endif #include #include -#include #include #include #ifdef __MACH__ @@ -61,29 +60,13 @@ #endif #include "metadata/sgen-gc.h" -#include "metadata/metadata-internals.h" -#include "metadata/class-internals.h" -#include "metadata/gc-internal.h" -#include "metadata/object-internals.h" -#include "metadata/threads.h" #include "metadata/sgen-cardtable.h" #include "metadata/sgen-protocol.h" #include "metadata/sgen-archdep.h" #include "metadata/sgen-bridge.h" #include "metadata/sgen-memory-governor.h" -#include "metadata/mono-gc.h" -#include "metadata/method-builder.h" -#include "metadata/profiler-private.h" -#include "metadata/monitor.h" -#include "metadata/threadpool-internals.h" -#include "metadata/mempool-internals.h" -#include "metadata/marshal.h" -#include "utils/mono-mmap.h" -#include "utils/mono-time.h" -#include "utils/mono-semaphore.h" -#include "utils/mono-counters.h" -#include "utils/mono-proclib.h" -#include "utils/mono-threads.h" +#include "metadata/sgen-pinning.h" +#include "metadata/sgen-client.h" /* Enable it so nursery allocation diagnostic data is collected */ //#define NALLOC_DEBUG 1 @@ -102,13 +85,11 @@ char *sgen_nursery_end; #ifdef USER_CONFIG size_t sgen_nursery_size = (1 << 22); -#ifdef SGEN_ALIGN_NURSERY int sgen_nursery_bits = 22; #endif -#endif -char *sgen_space_bitmap MONO_INTERNAL; -size_t sgen_space_bitmap_size MONO_INTERNAL; +char *sgen_space_bitmap; +size_t sgen_space_bitmap_size; #ifdef HEAVY_STATISTICS @@ -207,7 +188,7 @@ dump_alloc_records (void) printf ("------------------------------------DUMP RECORDS----------------------------\n"); for (i = 0; i < next_record; ++i) { AllocRecord *rec = alloc_records + i; - printf ("obj [%p, %p] size %zd reason %s seq %d tid %zx\n", rec->address, rec_end (rec), rec->size, get_reason_name (rec), rec->seq, (size_t)rec->tid); + printf ("obj [%p, %p] size %d reason %s seq %d tid %x\n", rec->address, rec_end (rec), (int)rec->size, get_reason_name (rec), rec->seq, (size_t)rec->tid); } } @@ -234,7 +215,7 @@ verify_alloc_records (void) hole_size = rec->address - rec_end (prev); max_hole = MAX (max_hole, hole_size); } - printf ("obj [%p, %p] size %zd hole to prev %d reason %s seq %d tid %zx\n", rec->address, rec_end (rec), rec->size, hole_size, get_reason_name (rec), rec->seq, (size_t)rec->tid); + printf ("obj [%p, %p] size %d hole to prev %d reason %s seq %d tid %zx\n", rec->address, rec_end (rec), (int)rec->size, hole_size, get_reason_name (rec), rec->seq, (size_t)rec->tid); prev = rec; } printf ("SUMMARY total alloc'd %d holes %d max_hole %d\n", total, holes, max_hole); @@ -669,25 +650,15 @@ sgen_clear_nursery_fragments (void) void sgen_clear_range (char *start, char *end) { - MonoArray *o; size_t size = end - start; if ((start && !end) || (start > end)) g_error ("Invalid range [%p %p]", start, end); - if (size < sizeof (MonoArray)) { - memset (start, 0, size); - return; + if (sgen_client_array_fill_range (start, size)) { + sgen_set_nursery_scan_start (start); + SGEN_ASSERT (0, start + sgen_safe_object_get_size ((GCObject*)start) == end, "Array fill produced wrong size"); } - - o = (MonoArray*)start; - o->obj.vtable = sgen_get_array_fill_vtable (); - /* Mark this as not a real object */ - o->obj.synchronisation = GINT_TO_POINTER (-1); - o->bounds = NULL; - o->max_length = (mono_array_size_t)(size - sizeof (MonoArray)); - sgen_set_nursery_scan_start (start); - g_assert (start + sgen_safe_object_get_size ((MonoObject*)o) == end); } void @@ -708,7 +679,6 @@ add_nursery_frag (SgenFragmentAllocator *allocator, size_t frag_size, char* frag { SGEN_LOG (4, "Found empty fragment: %p-%p, size: %zd", frag_start, frag_end, frag_size); binary_protocol_empty (frag_start, frag_size); - MONO_GC_NURSERY_SWEPT ((mword)frag_start, frag_end - frag_start); /* Not worth dealing with smaller fragments: need to tune */ if (frag_size >= SGEN_MAX_NURSERY_WASTE) { /* memsetting just the first chunk start is bound to provide better cache locality */ @@ -747,12 +717,12 @@ fragment_list_reverse (SgenFragmentAllocator *allocator) } mword -sgen_build_nursery_fragments (GCMemSection *nursery_section, void **start, size_t num_entries, SgenGrayQueue *unpin_queue) +sgen_build_nursery_fragments (GCMemSection *nursery_section, SgenGrayQueue *unpin_queue) { char *frag_start, *frag_end; size_t frag_size; - size_t i = 0; SgenFragment *frags_ranges; + void **pin_start, **pin_entry, **pin_end; #ifdef NALLOC_DEBUG reset_alloc_records (); @@ -769,14 +739,16 @@ sgen_build_nursery_fragments (GCMemSection *nursery_section, void **start, size_ /* clear scan starts */ memset (nursery_section->scan_starts, 0, nursery_section->num_scan_start * sizeof (gpointer)); - while (i < num_entries || frags_ranges) { + pin_start = pin_entry = sgen_pinning_get_entry (nursery_section->pin_queue_first_entry); + pin_end = sgen_pinning_get_entry (nursery_section->pin_queue_last_entry); + + while (pin_entry < pin_end || frags_ranges) { char *addr0, *addr1; size_t size; - SgenFragment *last_frag = NULL; addr0 = addr1 = sgen_nursery_end; - if (i < num_entries) - addr0 = start [i]; + if (pin_entry < pin_end) + addr0 = *pin_entry; if (frags_ranges) addr1 = frags_ranges->fragment_start; @@ -785,15 +757,14 @@ sgen_build_nursery_fragments (GCMemSection *nursery_section, void **start, size_ GRAY_OBJECT_ENQUEUE (unpin_queue, addr0, sgen_obj_get_descriptor_safe (addr0)); else SGEN_UNPIN_OBJECT (addr0); - size = SGEN_ALIGN_UP (sgen_safe_object_get_size ((MonoObject*)addr0)); + size = SGEN_ALIGN_UP (sgen_safe_object_get_size ((GCObject*)addr0)); CANARIFY_SIZE (size); sgen_set_nursery_scan_start (addr0); frag_end = addr0; - ++i; + ++pin_entry; } else { frag_end = addr1; size = frags_ranges->fragment_next - addr1; - last_frag = frags_ranges; frags_ranges = frags_ranges->next_in_order; } @@ -809,7 +780,7 @@ sgen_build_nursery_fragments (GCMemSection *nursery_section, void **start, size_ frag_size = size; #ifdef NALLOC_DEBUG - add_alloc_record (start [i], frag_size, PINNING); + add_alloc_record (*pin_entry, frag_size, PINNING); #endif frag_start = frag_end + frag_size; } @@ -830,9 +801,10 @@ sgen_build_nursery_fragments (GCMemSection *nursery_section, void **start, size_ sgen_minor_collector.build_fragments_finish (&mutator_allocator); if (!unmask (mutator_allocator.alloc_head)) { - SGEN_LOG (1, "Nursery fully pinned (%zd)", num_entries); - for (i = 0; i < num_entries; ++i) { - SGEN_LOG (3, "Bastard pinning obj %p (%s), size: %zd", start [i], sgen_safe_name (start [i]), sgen_safe_object_get_size (start [i])); + SGEN_LOG (1, "Nursery fully pinned"); + for (pin_entry = pin_start; pin_entry < pin_end; ++pin_entry) { + void *p = *pin_entry; + SGEN_LOG (3, "Bastard pinning obj %p (%s), size: %zd", p, sgen_client_object_safe_name (p), sgen_safe_object_get_size (p)); } } return fragment_total;