More write barrier clenaups.
authorRodrigo Kumpera <kumpera@gmail.com>
Wed, 1 Feb 2012 20:26:46 +0000 (18:26 -0200)
committerRodrigo Kumpera <kumpera@gmail.com>
Wed, 1 Feb 2012 21:06:19 +0000 (19:06 -0200)
mono/metadata/sgen-cardtable.c
mono/metadata/sgen-cardtable.h
mono/metadata/sgen-gc.c
mono/metadata/sgen-ssb.c
mono/metadata/sgen-ssb.h

index b93cec7c9cb39d56ba6aafc791f8a906c4f79f62..5510072253dbadbfc7a396668e17b89859124d62 100644 (file)
@@ -351,11 +351,13 @@ mono_sgen_card_table_prepare_for_major_collection (void)
 }
 
 void
-sgen_scan_from_card_tables (void *start_nursery, void *end_nursery, SgenGrayQueue *queue)
+mono_sgen_card_table_finish_scan_remsets (void *start_nursery, void *end_nursery, SgenGrayQueue *queue)
 {
        SGEN_TV_DECLARE (atv);
        SGEN_TV_DECLARE (btv);
 
+       sgen_card_tables_collect_stats (TRUE);
+
 #ifdef SGEN_HAVE_OVERLAPPING_CARDS
        /*FIXME we should have a bit on each block/los object telling if the object have marked cards.*/
        /*First we copy*/
index 01c5deeb4ab61abca2f8ae861872da2db8f9f68d..0b703395448cd31efb27ffd56f06b17be8df7e8b 100644 (file)
@@ -34,7 +34,7 @@ void sgen_card_table_mark_range (mword address, mword size) MONO_INTERNAL;
 void sgen_cardtable_scan_object (char *obj, mword obj_size, guint8 *cards, SgenGrayQueue *queue) MONO_INTERNAL;
 
 gboolean sgen_card_table_get_card_data (guint8 *dest, mword address, mword cards) MONO_INTERNAL;
-void sgen_scan_from_card_tables (void *start_nursery, void *end_nursery, SgenGrayQueue *queue) MONO_INTERNAL;
+void mono_sgen_card_table_finish_scan_remsets (void *start_nursery, void *end_nursery, SgenGrayQueue *queue) MONO_INTERNAL;
 void sgen_card_tables_collect_stats (gboolean begin) MONO_INTERNAL;
 void mono_sgen_card_table_prepare_for_major_collection (void) MONO_INTERNAL;
 void sgen_card_table_init (void) MONO_INTERNAL;
@@ -155,7 +155,7 @@ sgen_card_table_mark_range (mword address, mword size)
 }
 
 #define sgen_card_table_address_is_marked(p)   FALSE
-#define sgen_scan_from_card_tables(start,end,queue)
+#define mono_sgen_card_table_scan_from_remsets(start,end,queue)
 #define mono_sgen_card_table_prepare_for_major_collection()
 #define sgen_card_table_init()
 #define sgen_card_tables_collect_stats(begin)
index 981e7f585d255f5456f6cdb46a1e24439d0c540e..2114337bd0c6d589f5213075a78369be05bd3c47 100644 (file)
@@ -317,7 +317,6 @@ static long long stat_pinned_objects = 0;
 static long long time_minor_pre_collection_fragment_clear = 0;
 static long long time_minor_pinning = 0;
 static long long time_minor_scan_remsets = 0;
-static long long time_minor_scan_card_table = 0;
 static long long time_minor_scan_pinned = 0;
 static long long time_minor_scan_registered_roots = 0;
 static long long time_minor_scan_thread_data = 0;
@@ -2289,8 +2288,7 @@ init_stats (void)
 
        mono_counters_register ("Minor fragment clear", MONO_COUNTER_GC | MONO_COUNTER_LONG, &time_minor_pre_collection_fragment_clear);
        mono_counters_register ("Minor pinning", MONO_COUNTER_GC | MONO_COUNTER_LONG, &time_minor_pinning);
-       mono_counters_register ("Minor scan remsets", MONO_COUNTER_GC | MONO_COUNTER_LONG, &time_minor_scan_remsets);
-       mono_counters_register ("Minor scan cardtables", MONO_COUNTER_GC | MONO_COUNTER_LONG, &time_minor_scan_card_table);
+       mono_counters_register ("Minor scan remembered set", MONO_COUNTER_GC | MONO_COUNTER_LONG, &time_minor_scan_remsets);
        mono_counters_register ("Minor scan pinned", MONO_COUNTER_GC | MONO_COUNTER_LONG, &time_minor_scan_pinned);
        mono_counters_register ("Minor scan registered roots", MONO_COUNTER_GC | MONO_COUNTER_LONG, &time_minor_scan_registered_roots);
        mono_counters_register ("Minor scan thread data", MONO_COUNTER_GC | MONO_COUNTER_LONG, &time_minor_scan_thread_data);
@@ -2482,14 +2480,17 @@ typedef struct
 {
        char *heap_start;
        char *heap_end;
-} ScanFromRemsetsJobData;
+} FinishRememberedSetScanJobData;
 
 static void
-job_scan_from_remsets (WorkerData *worker_data, void *job_data_untyped)
+job_finish_remembered_set_scan (WorkerData *worker_data, void *job_data_untyped)
 {
-       ScanFromRemsetsJobData *job_data = job_data_untyped;
+       FinishRememberedSetScanJobData *job_data = job_data_untyped;
 
-       mono_sgen_ssb_scan_from_remsets (job_data->heap_start, job_data->heap_end, mono_sgen_workers_get_job_gray_queue (worker_data));
+       if (use_cardtable)
+               mono_sgen_card_table_finish_scan_remsets (job_data->heap_start, job_data->heap_end, mono_sgen_workers_get_job_gray_queue (worker_data));
+       else
+               mono_sgen_ssb_finish_scan_remsets (job_data->heap_start, job_data->heap_end, mono_sgen_workers_get_job_gray_queue (worker_data));
 }
 
 typedef struct
@@ -2589,7 +2590,7 @@ collect_nursery (size_t requested_size)
        gboolean needs_major;
        size_t max_garbage_amount;
        char *nursery_next;
-       ScanFromRemsetsJobData sfrjd;
+       FinishRememberedSetScanJobData frssjd;
        ScanFromRegisteredRootsJobData scrrjd_normal, scrrjd_wbarrier;
        ScanThreadDataJobData stdjd;
        mword fragment_total;
@@ -2675,33 +2676,23 @@ collect_nursery (size_t requested_size)
        mono_sgen_workers_start_all_workers ();
 
        /*
-        * Walk all the roots and copy the young objects to the old
-        * generation, starting from to_space.
-        *
-        * The global remsets must be processed before the workers start
-        * marking because they might add global remsets.
+        * Perform the sequential part of remembered set scanning.
+        * This usually involves scanning global information that might later be produced by evacuation.
         */
-       mono_sgen_ssb_scan_from_global_remsets (nursery_start, nursery_next, WORKERS_DISTRIBUTE_GRAY_QUEUE);
+       if (!use_cardtable)
+               mono_sgen_ssb_begin_scan_remsets (nursery_start, nursery_next, WORKERS_DISTRIBUTE_GRAY_QUEUE);
 
        mono_sgen_workers_start_marking ();
 
-       sfrjd.heap_start = nursery_start;
-       sfrjd.heap_end = nursery_next;
-       mono_sgen_workers_enqueue_job (job_scan_from_remsets, &sfrjd);
+       frssjd.heap_start = nursery_start;
+       frssjd.heap_end = nursery_next;
+       mono_sgen_workers_enqueue_job (job_finish_remembered_set_scan, &frssjd);
 
        /* we don't have complete write barrier yet, so we scan all the old generation sections */
        TV_GETTIME (btv);
        time_minor_scan_remsets += TV_ELAPSED_MS (atv, btv);
        DEBUG (2, fprintf (gc_debug_file, "Old generation scan: %d usecs\n", TV_ELAPSED (atv, btv)));
 
-       if (use_cardtable) {
-               atv = btv;
-               sgen_card_tables_collect_stats (TRUE);
-               sgen_scan_from_card_tables (nursery_start, nursery_next, WORKERS_DISTRIBUTE_GRAY_QUEUE);
-               TV_GETTIME (btv);
-               time_minor_scan_card_table += TV_ELAPSED_MS (atv, btv);
-       }
-
        if (!mono_sgen_collection_is_parallel ())
                mono_sgen_drain_gray_stack (&gray_queue, -1);
 
index 92b4ae63682e302e91cad9cd2ff12e4a1c1e9031..ddf71f808d6ad9ab1065ba3ad2e9127f44daddee 100644 (file)
@@ -473,7 +473,7 @@ handle_remset (mword *p, void *start_nursery, void *end_nursery, gboolean global
 }
 
 void
-mono_sgen_ssb_scan_from_global_remsets (void *start_nursery, void *end_nursery, SgenGrayQueue *queue)
+mono_sgen_ssb_begin_scan_remsets (void *start_nursery, void *end_nursery, SgenGrayQueue *queue)
 {
        RememberedSet *remset;
        mword *p, *next_p, *store_pos;
@@ -512,7 +512,7 @@ mono_sgen_ssb_scan_from_global_remsets (void *start_nursery, void *end_nursery,
 }
 
 void
-mono_sgen_ssb_scan_from_remsets (void *start_nursery, void *end_nursery, SgenGrayQueue *queue)
+mono_sgen_ssb_finish_scan_remsets (void *start_nursery, void *end_nursery, SgenGrayQueue *queue)
 {
        int i;
        SgenThreadInfo *info;
index ac0920d4c7674415f9c1da5886d4a4d6534173d6..5dfdd876ffacdb1e8c18164e06ef0edc949dfdcd 100644 (file)
@@ -32,8 +32,8 @@ void mono_sgen_ssb_wbarrier_value_copy (gpointer dest, gpointer src, int count,
 void mono_sgen_ssb_wbarrier_object_copy (MonoObject* obj, MonoObject *src) MONO_INTERNAL;
 void mono_sgen_ssb_wbarrier_generic_nostore (gpointer ptr) MONO_INTERNAL;
 
-void mono_sgen_ssb_scan_from_global_remsets (void *start_nursery, void *end_nursery, SgenGrayQueue *queue) MONO_INTERNAL;
-void mono_sgen_ssb_scan_from_remsets (void *start_nursery, void *end_nursery, SgenGrayQueue *queue) MONO_INTERNAL;
+void mono_sgen_ssb_finish_scan_remsets (void *start_nursery, void *end_nursery, SgenGrayQueue *queue) MONO_INTERNAL;
+void mono_sgen_ssb_begin_scan_remsets (void *start_nursery, void *end_nursery, SgenGrayQueue *queue) MONO_INTERNAL;
 
 void mono_sgen_ssb_cleanup_thread (SgenThreadInfo *p) MONO_INTERNAL;
 void mono_sgen_ssb_register_thread (SgenThreadInfo *p) MONO_INTERNAL;