[sgen] Parallel mod union scan jobs
authorVlad Brezae <brezaevlad@gmail.com>
Wed, 28 Sep 2016 13:59:34 +0000 (16:59 +0300)
committerVlad Brezae <brezaevlad@gmail.com>
Thu, 19 Jan 2017 22:45:14 +0000 (00:45 +0200)
mono/sgen/sgen-gc.c

index bc676e8a430d0a9479cb6605789ff97ab8885ee5..c689cd237b4ce9b4b35451f85f701988346f86f2 100644 (file)
@@ -1390,21 +1390,21 @@ job_scan_finalizer_entries (void *worker_data_untyped, SgenThreadPoolJob *job)
 static void
 job_scan_major_mod_union_card_table (void *worker_data_untyped, SgenThreadPoolJob *job)
 {
-       ScanJob *job_data = (ScanJob*)job;
-       ScanCopyContext ctx = scan_copy_context_for_scan_job (worker_data_untyped, job_data);
+       ParallelScanJob *job_data = (ParallelScanJob*)job;
+       ScanCopyContext ctx = scan_copy_context_for_scan_job (worker_data_untyped, (ScanJob*)job_data);
 
        g_assert (concurrent_collection_in_progress);
-       major_collector.scan_card_table (CARDTABLE_SCAN_MOD_UNION, ctx, 0, 1);
+       major_collector.scan_card_table (CARDTABLE_SCAN_MOD_UNION, ctx, job_data->job_index, sgen_workers_get_job_split_count ());
 }
 
 static void
 job_scan_los_mod_union_card_table (void *worker_data_untyped, SgenThreadPoolJob *job)
 {
-       ScanJob *job_data = (ScanJob*)job;
-       ScanCopyContext ctx = scan_copy_context_for_scan_job (worker_data_untyped, job_data);
+       ParallelScanJob *job_data = (ParallelScanJob*)job;
+       ScanCopyContext ctx = scan_copy_context_for_scan_job (worker_data_untyped, (ScanJob*)job_data);
 
        g_assert (concurrent_collection_in_progress);
-       sgen_los_scan_card_table (CARDTABLE_SCAN_MOD_UNION, ctx, 0, 1);
+       sgen_los_scan_card_table (CARDTABLE_SCAN_MOD_UNION, ctx, job_data->job_index, sgen_workers_get_job_split_count ());
 }
 
 static void
@@ -1909,20 +1909,26 @@ major_copy_or_mark_from_roots (SgenGrayQueue *gc_thread_gray_queue, size_t *old_
        }
 
        if (mode == COPY_OR_MARK_FROM_ROOTS_FINISH_CONCURRENT) {
-               ScanJob *sj;
+               int i, split_count = sgen_workers_get_job_split_count ();
 
                gray_queue_redirect (gc_thread_gray_queue);
 
                /* Mod union card table */
-               sj = (ScanJob*)sgen_thread_pool_job_alloc ("scan mod union cardtable", job_scan_major_mod_union_card_table, sizeof (ScanJob));
-               sj->ops = worker_object_ops;
-               sj->gc_thread_gray_queue = NULL;
-               sgen_workers_enqueue_job (&sj->job, TRUE);
-
-               sj = (ScanJob*)sgen_thread_pool_job_alloc ("scan LOS mod union cardtable", job_scan_los_mod_union_card_table, sizeof (ScanJob));
-               sj->ops = worker_object_ops;
-               sj->gc_thread_gray_queue = NULL;
-               sgen_workers_enqueue_job (&sj->job, TRUE);
+               for (i = 0; i < split_count; i++) {
+                       ParallelScanJob *psj;
+
+                       psj = (ParallelScanJob*)sgen_thread_pool_job_alloc ("scan mod union cardtable", job_scan_major_mod_union_card_table, sizeof (ParallelScanJob));
+                       psj->scan_job.ops = worker_object_ops;
+                       psj->scan_job.gc_thread_gray_queue = NULL;
+                       psj->job_index = i;
+                       sgen_workers_enqueue_job (&psj->scan_job.job, TRUE);
+
+                       psj = (ParallelScanJob*)sgen_thread_pool_job_alloc ("scan LOS mod union cardtable", job_scan_los_mod_union_card_table, sizeof (ParallelScanJob));
+                       psj->scan_job.ops = worker_object_ops;
+                       psj->scan_job.gc_thread_gray_queue = NULL;
+                       psj->job_index = i;
+                       sgen_workers_enqueue_job (&psj->scan_job.job, TRUE);
+               }
 
                /*
                 * If we enqueue a job while workers are running we need to sgen_workers_ensure_awake