[sgen] Add option for a new parallel concurrent collector
authorVlad Brezae <brezaevlad@gmail.com>
Mon, 16 May 2016 19:57:17 +0000 (22:57 +0300)
committerVlad Brezae <brezaevlad@gmail.com>
Thu, 19 Jan 2017 18:05:11 +0000 (20:05 +0200)
mono/sgen/sgen-gc.c
mono/sgen/sgen-gc.h
mono/sgen/sgen-marksweep.c

index 2fdd86c2bf0613f7e75129c417d5a3341f82c1a4..e95bf8edba7f7f1cf917bbcbe5847cdb288badbc 100644 (file)
@@ -1907,7 +1907,11 @@ major_start_collection (SgenGrayQueue *gc_thread_gray_queue, const char *reason,
                g_assert (major_collector.is_concurrent);
                concurrent_collection_in_progress = TRUE;
 
-               object_ops = &major_collector.major_ops_concurrent_start;
+               if (major_collector.is_parallel)
+                       object_ops = &major_collector.major_ops_conc_par_start;
+               else
+                       object_ops = &major_collector.major_ops_concurrent_start;
+
        } else {
                object_ops = &major_collector.major_ops_serial;
        }
@@ -1943,7 +1947,10 @@ major_finish_collection (SgenGrayQueue *gc_thread_gray_queue, const char *reason
        TV_GETTIME (btv);
 
        if (concurrent_collection_in_progress) {
-               object_ops = &major_collector.major_ops_concurrent_finish;
+               if (major_collector.is_parallel)
+                       object_ops = &major_collector.major_ops_conc_par_finish;
+               else
+                       object_ops = &major_collector.major_ops_concurrent_finish;
 
                major_copy_or_mark_from_roots (gc_thread_gray_queue, NULL, COPY_OR_MARK_FROM_ROOTS_FINISH_CONCURRENT, object_ops);
 
@@ -2850,6 +2857,8 @@ sgen_gc_init (void)
                sgen_marksweep_init (&major_collector);
        } else if (!strcmp (major_collector_opt, "marksweep-conc")) {
                sgen_marksweep_conc_init (&major_collector);
+       } else if (!strcmp (major_collector_opt, "marksweep-conc-par")) {
+               sgen_marksweep_conc_par_init (&major_collector);
        } else {
                sgen_env_var_error (MONO_GC_PARAMS_NAME, "Using `" DEFAULT_MAJOR_NAME "` instead.", "Unknown major collector `%s'.", major_collector_opt);
                goto use_default_major;
index 9ab34848b44e2328027b63bc3195c1a68b288807..1609d2386b6c4fa5eef21b11837bc2cd9dfe9a57 100644 (file)
@@ -620,6 +620,7 @@ typedef struct _SgenMajorCollector SgenMajorCollector;
 struct _SgenMajorCollector {
        size_t section_size;
        gboolean is_concurrent;
+       gboolean is_parallel;
        gboolean needs_thread_pool;
        gboolean supports_cardtable;
        gboolean sweeps_lazily;
@@ -632,6 +633,8 @@ struct _SgenMajorCollector {
        SgenObjectOperations major_ops_serial;
        SgenObjectOperations major_ops_concurrent_start;
        SgenObjectOperations major_ops_concurrent_finish;
+       SgenObjectOperations major_ops_conc_par_start;
+       SgenObjectOperations major_ops_conc_par_finish;
 
        GCObject* (*alloc_object) (GCVTable vtable, size_t size, gboolean has_references);
        void (*free_pinned_object) (GCObject *obj, size_t size);
@@ -680,6 +683,7 @@ extern SgenMajorCollector major_collector;
 
 void sgen_marksweep_init (SgenMajorCollector *collector);
 void sgen_marksweep_conc_init (SgenMajorCollector *collector);
+void sgen_marksweep_conc_par_init (SgenMajorCollector *collector);
 SgenMajorCollector* sgen_get_major_collector (void);
 
 
index 6373792522d49fefdb4aacd776e30928958590d7..9f0b24f4868e784a4a123003327f543df429de16 100644 (file)
@@ -2539,7 +2539,7 @@ post_param_init (SgenMajorCollector *collector)
 }
 
 static void
-sgen_marksweep_init_internal (SgenMajorCollector *collector, gboolean is_concurrent)
+sgen_marksweep_init_internal (SgenMajorCollector *collector, gboolean is_concurrent, gboolean is_parallel)
 {
        int i;
 
@@ -2586,6 +2586,7 @@ sgen_marksweep_init_internal (SgenMajorCollector *collector, gboolean is_concurr
 
        concurrent_mark = is_concurrent;
        collector->is_concurrent = is_concurrent;
+       collector->is_parallel = is_parallel;
        collector->needs_thread_pool = is_concurrent || concurrent_sweep;
        collector->get_and_reset_num_major_objects_marked = major_get_and_reset_num_major_objects_marked;
        collector->supports_cardtable = TRUE;
@@ -2647,6 +2648,12 @@ sgen_marksweep_init_internal (SgenMajorCollector *collector, gboolean is_concurr
                collector->major_ops_concurrent_finish.scan_vtype = major_scan_vtype_with_evacuation;
                collector->major_ops_concurrent_finish.scan_ptr_field = major_scan_ptr_field_with_evacuation;
                collector->major_ops_concurrent_finish.drain_gray_stack = drain_gray_stack;
+
+               if (is_parallel) {
+                       /* FIXME use parallel obj ops */
+                       collector->major_ops_conc_par_start = collector->major_ops_concurrent_start;
+                       collector->major_ops_conc_par_finish = collector->major_ops_concurrent_finish;
+               }
        }
 
 #ifdef HEAVY_STATISTICS
@@ -2680,13 +2687,19 @@ sgen_marksweep_init_internal (SgenMajorCollector *collector, gboolean is_concurr
 void
 sgen_marksweep_init (SgenMajorCollector *collector)
 {
-       sgen_marksweep_init_internal (collector, FALSE);
+       sgen_marksweep_init_internal (collector, FALSE, FALSE);
 }
 
 void
 sgen_marksweep_conc_init (SgenMajorCollector *collector)
 {
-       sgen_marksweep_init_internal (collector, TRUE);
+       sgen_marksweep_init_internal (collector, TRUE, FALSE);
+}
+
+void
+sgen_marksweep_conc_par_init (SgenMajorCollector *collector)
+{
+       sgen_marksweep_init_internal (collector, TRUE, TRUE);
 }
 
 #endif