Rename functions that will be part of the nursery-allocator API.
authorRodrigo Kumpera <kumpera@gmail.com>
Sat, 14 May 2011 21:26:11 +0000 (18:26 -0300)
committerRodrigo Kumpera <kumpera@gmail.com>
Thu, 26 May 2011 22:05:48 +0000 (19:05 -0300)
* sgen-gc.c: Move more nursery-allocator behavior to
the new file.

mono/metadata/sgen-gc.c
mono/metadata/sgen-gc.h
mono/metadata/sgen-nursery-allocator.c

index 43610bf408445ebb9d3a89ddf5b66af450910838..44960c03723486bd6668a0a493bd749a2c6ea045 100644 (file)
@@ -1486,7 +1486,7 @@ mono_gc_clear_domain (MonoDomain * domain)
        process_fin_stage_entries ();
        process_dislink_stage_entries ();
 
-       clear_nursery_fragments (nursery_next);
+       mono_sgen_clear_nursery_fragments (nursery_next);
 
        if (xdomain_checks && domain != mono_get_root_domain ()) {
                scan_for_registered_roots_in_domain (domain, ROOT_TYPE_NORMAL);
@@ -2184,8 +2184,7 @@ alloc_nursery (void)
 
        nursery_section = section;
 
-       /* Setup the single first large fragment */
-       add_fragment (nursery_start, nursery_end);
+       mono_sgen_nursery_allocator_set_nursery_bounds (nursery_start, nursery_end);
 }
 
 void*
@@ -2869,6 +2868,7 @@ collect_nursery (size_t requested_size)
        ScanFromRemsetsJobData sfrjd;
        ScanFromRegisteredRootsJobData scrrjd_normal, scrrjd_wbarrier;
        ScanThreadDataJobData stdjd;
+       mword fragment_total;
        TV_DECLARE (all_atv);
        TV_DECLARE (all_btv);
        TV_DECLARE (atv);
@@ -2900,7 +2900,7 @@ collect_nursery (size_t requested_size)
        atv = all_atv;
 
        /* Pinning no longer depends on clearing all nursery fragments */
-       clear_current_nursery_fragment (orig_nursery_next);
+       mono_sgen_clear_current_nursery_fragment (orig_nursery_next);
 
        TV_GETTIME (btv);
        time_minor_pre_collection_fragment_clear += TV_ELAPSED_MS (atv, btv);
@@ -3044,7 +3044,10 @@ collect_nursery (size_t requested_size)
         * next allocations.
         */
        mono_profiler_gc_event (MONO_GC_EVENT_RECLAIM_START, 0);
-       build_nursery_fragments (pin_queue, next_pin_slot);
+       fragment_total = mono_sgen_build_nursery_fragments (pin_queue, next_pin_slot);
+       /* Clear TLABs for all threads */
+       clear_tlabs ();
+
        mono_profiler_gc_event (MONO_GC_EVENT_RECLAIM_END, 0);
        TV_GETTIME (btv);
        time_minor_fragment_creation += TV_ELAPSED_MS (atv, btv);
@@ -3150,7 +3153,7 @@ major_do_collection (const char *reason)
        atv = all_atv;
 
        /* Pinning depends on this */
-       clear_nursery_fragments (nursery_next);
+       mono_sgen_clear_nursery_fragments (nursery_next);
 
        TV_GETTIME (btv);
        time_major_pre_collection_fragment_clear += TV_ELAPSED_MS (atv, btv);
@@ -3361,7 +3364,9 @@ major_do_collection (const char *reason)
         * pinned objects as we go, memzero() the empty fragments so they are ready for the
         * next allocations.
         */
-       build_nursery_fragments (nursery_section->pin_queue_start, nursery_section->pin_queue_num_entries);
+       mono_sgen_build_nursery_fragments (nursery_section->pin_queue_start, nursery_section->pin_queue_num_entries);
+       /* Clear TLABs for all threads */
+       clear_tlabs ();
 
        TV_GETTIME (atv);
        time_major_fragment_creation += TV_ELAPSED_MS (btv, atv);
@@ -3443,7 +3448,7 @@ minor_collect_or_expand_inner (size_t size)
                DEBUG (2, fprintf (gc_debug_file, "Heap size: %lu, LOS size: %lu\n", (unsigned long)total_alloc, (unsigned long)los_memory_usage));
                restart_world (0);
                /* this also sets the proper pointers for the next allocation */
-               if (!alloc_fragment_for_size (size)) {
+               if (!mono_sgen_alloc_fragment_for_size (size)) {
                        int i;
                        /* TypeBuilder and MonoMethod are killing mcs with fragmentation */
                        DEBUG (1, fprintf (gc_debug_file, "nursery collection didn't find enough room for %zd alloc (%d pinned)\n", size, last_num_pinned));
@@ -3573,7 +3578,7 @@ mono_gc_alloc_obj_nolock (MonoVTable *vtable, size_t size)
                        collect_nursery (0);
                        restart_world (0);
                        mono_profiler_gc_event (MONO_GC_EVENT_END, 0);
-                       if (!degraded_mode && !alloc_fragment_for_size (size) && size <= MAX_SMALL_OBJ_SIZE) {
+                       if (!degraded_mode && !mono_sgen_alloc_fragment_for_size (size) && size <= MAX_SMALL_OBJ_SIZE) {
                                // FIXME:
                                g_assert_not_reached ();
                        }
@@ -3653,7 +3658,7 @@ mono_gc_alloc_obj_nolock (MonoVTable *vtable, size_t size)
                        if (size > tlab_size) {
                                /* Allocate directly from the nursery */
                                if (nursery_next + size >= nursery_frag_real_end) {
-                                       if (!alloc_fragment_for_size (size)) {
+                                       if (!mono_sgen_alloc_fragment_for_size (size)) {
                                                minor_collect_or_expand_inner (size);
                                                if (degraded_mode) {
                                                        p = alloc_degraded (vtable, size);
@@ -3683,7 +3688,7 @@ mono_gc_alloc_obj_nolock (MonoVTable *vtable, size_t size)
                                        if (available_in_nursery > MAX_NURSERY_TLAB_WASTE && available_in_nursery > size) {
                                                alloc_size = available_in_nursery;
                                        } else {
-                                               alloc_size = alloc_fragment_for_size_range (tlab_size, size);
+                                               alloc_size = mono_sgen_alloc_fragment_for_size_range (tlab_size, size);
                                                if (!alloc_size) {
                                                        alloc_size = tlab_size;
                                                        minor_collect_or_expand_inner (tlab_size);
@@ -6206,7 +6211,7 @@ mono_gc_walk_heap (int flags, MonoGCReferences callback, void *data)
        hwi.callback = callback;
        hwi.data = data;
 
-       clear_nursery_fragments (nursery_next);
+       mono_sgen_clear_nursery_fragments (nursery_next);
        mono_sgen_scan_area_with_callback (nursery_section->data, nursery_section->end_data, walk_references, &hwi, FALSE);
 
        major_collector.iterate_objects (TRUE, TRUE, walk_references, &hwi);
index 5a8bc23e1e47caf61da528f31f4c8a8a893d29f4..aa1ac022beede9cbb6f94f0a70ff083733b25c19 100644 (file)
@@ -814,6 +814,19 @@ void mono_sgen_los_iterate_live_block_ranges (sgen_cardtable_block_callback call
 void mono_sgen_los_scan_card_table (SgenGrayQueue *queue) MONO_INTERNAL;
 FILE *mono_sgen_get_logfile (void) MONO_INTERNAL;
 
+/* nursery allocator */
+
+void mono_sgen_clear_nursery_fragments (char *next) MONO_INTERNAL;
+void mono_sgen_nursery_allocator_prepare_for_pinning (void) MONO_INTERNAL;
+void mono_sgen_clear_current_nursery_fragment (char *next) MONO_INTERNAL;
+void mono_sgen_nursery_allocator_set_nursery_bounds (char *nursery_start, char *nursery_end) MONO_INTERNAL;
+mword mono_sgen_build_nursery_fragments (void **start, int num_entries) MONO_INTERNAL;
+void mono_sgen_init_nursery_allocator (void) MONO_INTERNAL;
+void mono_sgen_nursery_allocator_init_heavy_stats (void) MONO_INTERNAL;
+int mono_sgen_alloc_fragment_for_size_range (size_t desired_size, size_t minimum_size) MONO_INTERNAL;
+gboolean mono_sgen_alloc_fragment_for_size (size_t size) MONO_INTERNAL;
+
+
 #endif /* HAVE_SGEN_GC */
 
 #endif /* __MONO_SGENGC_H__ */
index a20eacfb4f31604b1af1a11cd96333b922681a0d..800c98ecb404e5fbbb0dc761f61b4a177ad6e036 100644 (file)
@@ -39,6 +39,7 @@
  * Thread local allocation is done from areas of memory Hotspot calls Thread Local 
  * Allocation Buffers (TLABs).
  */
+
 typedef struct _Fragment Fragment;
 
 struct _Fragment {
@@ -63,10 +64,6 @@ static long long stat_wasted_fragments_bytes = 0;
 
 #endif
 
-static gboolean alloc_fragment_for_size (size_t size);
-static int alloc_fragment_for_size_range (size_t desired_size, size_t minimum_size);
-static void clear_nursery_fragments (char *next);
-
 static Fragment*
 alloc_fragment (void)
 {
@@ -112,8 +109,8 @@ setup_fragment (Fragment *frag, Fragment *prev, size_t size)
        fragment_freelist = frag;
 }
 
-static void
-clear_current_nursery_fragment (char *next)
+void
+mono_sgen_clear_current_nursery_fragment (char *next)
 {
        if (nursery_clear_policy == CLEAR_AT_TLAB_CREATION) {
                g_assert (next <= nursery_frag_real_end);
@@ -123,8 +120,8 @@ clear_current_nursery_fragment (char *next)
 }
 
 /* Clear all remaining nursery fragments */
-static void
-clear_nursery_fragments (char *next)
+void
+mono_sgen_clear_nursery_fragments (char *next)
 {
        Fragment *frag;
        if (nursery_clear_policy == CLEAR_AT_TLAB_CREATION) {
@@ -136,7 +133,7 @@ clear_nursery_fragments (char *next)
        }
 }
 
-static void
+void
 mono_sgen_nursery_allocator_prepare_for_pinning (void)
 {
        Fragment *frag;
@@ -193,8 +190,8 @@ add_nursery_frag (size_t frag_size, char* frag_start, char* frag_end)
 }
 
 
-static void
-build_nursery_fragments (void **start, int num_entries)
+mword
+mono_sgen_build_nursery_fragments (void **start, int num_entries)
 {
        char *frag_start, *frag_end;
        size_t frag_size;
@@ -235,9 +232,7 @@ build_nursery_fragments (void **start, int num_entries)
        }
 
        nursery_next = nursery_frag_real_end = NULL;
-
-       /* Clear TLABs for all threads */
-       clear_tlabs ();
+       return fragment_total;
 }
 
 /*** Nursery memory allocation ***/
@@ -247,8 +242,8 @@ build_nursery_fragments (void **start, int num_entries)
  * nursery_next and nursery_frag_real_end are set to the boundaries of the fragment.
  * Return TRUE if found, FALSE otherwise.
  */
-static gboolean
-alloc_fragment_for_size (size_t size)
+gboolean
+mono_sgen_alloc_fragment_for_size (size_t size)
 {
        Fragment *frag, *prev;
        DEBUG (4, fprintf (gc_debug_file, "Searching nursery fragment %p, size: %zd\n", nursery_frag_real_end, size));
@@ -273,8 +268,8 @@ alloc_fragment_for_size (size_t size)
  * Same as alloc_fragment_for_size but if search for @desired_size fails, try to satisfy @minimum_size.
  * This improves nursery usage.
  */
-static int
-alloc_fragment_for_size_range (size_t desired_size, size_t minimum_size)
+int
+mono_sgen_alloc_fragment_for_size_range (size_t desired_size, size_t minimum_size)
 {
        Fragment *frag, *prev, *min_prev;
        DEBUG (4, fprintf (gc_debug_file, "Searching nursery fragment %p, desired size: %zd minimum size %zd\n", nursery_frag_real_end, desired_size, minimum_size));
@@ -321,7 +316,7 @@ alloc_fragment_for_size_range (size_t desired_size, size_t minimum_size)
 
 #ifdef HEAVY_STATISTICS
 
-static void
+void
 mono_sgen_nursery_allocator_init_heavy_stats (void)
 {
        mono_counters_register ("# wasted fragments used", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_wasted_fragments_used);
@@ -330,8 +325,15 @@ mono_sgen_nursery_allocator_init_heavy_stats (void)
 
 #endif
 
-static void
+void
 mono_sgen_init_nursery_allocator (void)
 {
        mono_sgen_register_fixed_internal_mem_type (INTERNAL_MEM_FRAGMENT, sizeof (Fragment));
 }
+
+void
+mono_sgen_nursery_allocator_set_nursery_bounds (char *nursery_start, char *nursery_end)
+{
+       /* Setup the single first large fragment */
+       add_fragment (nursery_start, nursery_end);      
+}