Merge pull request #3080 from BrzVlad/feature-enable-conc-master
authorRodrigo Kumpera <kumpera@gmail.com>
Tue, 31 May 2016 20:58:09 +0000 (13:58 -0700)
committerRodrigo Kumpera <kumpera@gmail.com>
Tue, 31 May 2016 20:58:09 +0000 (13:58 -0700)
[sgen] Enable concurrent major by default on desktop platforms

1  2 
mono/sgen/sgen-gc.c

diff --combined mono/sgen/sgen-gc.c
index eb65d09b9a30154a2d275d620878e374e7e97c1a,560d6e3090b15c66e55e89d121131bc674192bb9..b327ebd5a4d74b5e221611b0951d8695f57440b0
@@@ -326,6 -326,15 +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 +701,7 @@@ pin_objects_from_nursery_pin_queue (gbo
  
                        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,8 -736,6 +736,8 @@@ pin_objects_in_nursery (gboolean do_sca
  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.
        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));
  }
@@@ -1571,7 -1578,7 +1580,7 @@@ collect_nursery (const char *reason, gb
        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);
@@@ -1768,7 -1775,7 +1777,7 @@@ major_copy_or_mark_from_roots (size_t *
                        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));
                time_major_scan_mod_union += TV_ELAPSED (btv, atv);
        }
  
 -      sgen_pin_stats_print_class_stats ();
 +      sgen_pin_stats_report ();
  }
  
  static void
@@@ -2813,14 -2820,16 +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;
@@@ -3152,12 -3161,6 +3163,12 @@@ sgen_major_collector_iterate_live_block
        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)
  {