Merge pull request #3080 from BrzVlad/feature-enable-conc-master
[mono.git] / mono / sgen / sgen-gc.c
index 37a162b240c3c44a9957d69a072ea18a6ff20301..b327ebd5a4d74b5e221611b0951d8695f57440b0 100644 (file)
@@ -326,6 +326,15 @@ nursery_canaries_enabled (void)
 
 #define safe_object_get_size   sgen_safe_object_get_size
 
+#if defined(PLATFORM_MACOSX) || defined(HOST_WIN32) || (defined(__linux__) && !defined(PLATFORM_ANDROID))
+/* Use concurrent major on deskstop platforms */
+#define DEFAULT_MAJOR_INIT sgen_marksweep_conc_init
+#define DEFAULT_MAJOR_NAME "marksweep-conc"
+#else
+#define DEFAULT_MAJOR_INIT sgen_marksweep_init
+#define DEFAULT_MAJOR_NAME "marksweep"
+#endif
+
 /*
  * ######################################################################
  * ########  Global data.
@@ -692,7 +701,7 @@ pin_objects_from_nursery_pin_queue (gboolean do_scan_objects, ScanCopyContext ct
 
                        pin_object (obj_to_pin);
                        GRAY_OBJECT_ENQUEUE (queue, obj_to_pin, desc);
-                       sgen_pin_stats_register_object (obj_to_pin, obj_to_pin_size);
+                       sgen_pin_stats_register_object (obj_to_pin, GENERATION_NURSERY);
                        definitely_pinned [count] = obj_to_pin;
                        count++;
                }
@@ -727,6 +736,8 @@ pin_objects_in_nursery (gboolean do_scan_objects, ScanCopyContext ctx)
 void
 sgen_pin_object (GCObject *object, GrayQueue *queue)
 {
+       SGEN_ASSERT (0, sgen_ptr_in_nursery (object), "We're only supposed to use this for pinning nursery objects when out of memory.");
+
        /*
         * All pinned objects are assumed to have been staged, so we need to stage as well.
         * Also, the count of staged objects shows that "late pinning" happened.
@@ -737,7 +748,7 @@ sgen_pin_object (GCObject *object, GrayQueue *queue)
        binary_protocol_pin (object, (gpointer)LOAD_VTABLE (object), safe_object_get_size (object));
 
        ++objects_pinned;
-       sgen_pin_stats_register_object (object, safe_object_get_size (object));
+       sgen_pin_stats_register_object (object, GENERATION_NURSERY);
 
        GRAY_OBJECT_ENQUEUE (queue, object, sgen_obj_get_descriptor_safe (object));
 }
@@ -1569,7 +1580,7 @@ collect_nursery (const char *reason, gboolean is_overflow, SgenGrayQueue *unpin_
        time_minor_scan_remsets += TV_ELAPSED (atv, btv);
        SGEN_LOG (2, "Old generation scan: %lld usecs", (long long)TV_ELAPSED (atv, btv));
 
-       sgen_pin_stats_print_class_stats ();
+       sgen_pin_stats_report ();
 
        /* FIXME: Why do we do this at this specific, seemingly random, point? */
        sgen_client_collecting_minor (&fin_ready_queue, &critical_fin_queue);
@@ -1766,7 +1777,7 @@ major_copy_or_mark_from_roots (size_t *old_next_pin_slot, CopyOrMarkFromRootsMod
                        sgen_los_pin_object (bigobj->data);
                        if (SGEN_OBJECT_HAS_REFERENCES (bigobj->data))
                                GRAY_OBJECT_ENQUEUE (WORKERS_DISTRIBUTE_GRAY_QUEUE, bigobj->data, sgen_obj_get_descriptor ((GCObject*)bigobj->data));
-                       sgen_pin_stats_register_object (bigobj->data, safe_object_get_size (bigobj->data));
+                       sgen_pin_stats_register_object (bigobj->data, GENERATION_OLD);
                        SGEN_LOG (6, "Marked large object %p (%s) size: %lu from roots", bigobj->data,
                                        sgen_client_vtable_get_name (SGEN_LOAD_VTABLE (bigobj->data)),
                                        (unsigned long)sgen_los_object_size (bigobj));
@@ -1852,7 +1863,7 @@ major_copy_or_mark_from_roots (size_t *old_next_pin_slot, CopyOrMarkFromRootsMod
                time_major_scan_mod_union += TV_ELAPSED (btv, atv);
        }
 
-       sgen_pin_stats_print_class_stats ();
+       sgen_pin_stats_report ();
 }
 
 static void
@@ -2811,14 +2822,16 @@ sgen_gc_init (void)
                }
        }
 
-       if (!major_collector_opt || !strcmp (major_collector_opt, "marksweep")) {
-       use_marksweep_major:
+       if (!major_collector_opt) {
+       use_default_major:
+               DEFAULT_MAJOR_INIT (&major_collector);
+       } else if (!strcmp (major_collector_opt, "marksweep")) {
                sgen_marksweep_init (&major_collector);
-       } else if (!major_collector_opt || !strcmp (major_collector_opt, "marksweep-conc")) {
+       } else if (!strcmp (major_collector_opt, "marksweep-conc")) {
                sgen_marksweep_conc_init (&major_collector);
        } else {
-               sgen_env_var_error (MONO_GC_PARAMS_NAME, "Using `marksweep` instead.", "Unknown major collector `%s'.", major_collector_opt);
-               goto use_marksweep_major;
+               sgen_env_var_error (MONO_GC_PARAMS_NAME, "Using `" DEFAULT_MAJOR_NAME "` instead.", "Unknown major collector `%s'.", major_collector_opt);
+               goto use_default_major;
        }
 
        sgen_nursery_size = DEFAULT_NURSERY_SIZE;
@@ -3150,6 +3163,12 @@ sgen_major_collector_iterate_live_block_ranges (sgen_cardtable_block_callback ca
        major_collector.iterate_live_block_ranges (callback);
 }
 
+void
+sgen_major_collector_iterate_block_ranges (sgen_cardtable_block_callback callback)
+{
+       major_collector.iterate_block_ranges (callback);
+}
+
 SgenMajorCollector*
 sgen_get_major_collector (void)
 {