From 792ec4419ace28be26b7126e4e507d45117d4576 Mon Sep 17 00:00:00 2001 From: Vlad Brezae Date: Wed, 28 Sep 2016 16:59:34 +0300 Subject: [PATCH] [sgen] Parallel mod union scan jobs --- mono/sgen/sgen-gc.c | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/mono/sgen/sgen-gc.c b/mono/sgen/sgen-gc.c index bc676e8a430..c689cd237b4 100644 --- a/mono/sgen/sgen-gc.c +++ b/mono/sgen/sgen-gc.c @@ -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 -- 2.25.1