X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fsgen%2Fsgen-marksweep-scan-object-concurrent.h;h=8ebd8eee2a14a2a05ae799eb74d6f12b6076bd73;hb=7ac23bc974fa7f4db71fa7885ac78463ac5e2fb8;hp=b2061da8ca18b15dce41354c0c054571493bf156;hpb=46a6b5484007522283f2173534dbbd830ad625dc;p=mono.git diff --git a/mono/sgen/sgen-marksweep-scan-object-concurrent.h b/mono/sgen/sgen-marksweep-scan-object-concurrent.h index b2061da8ca1..8ebd8eee2a1 100644 --- a/mono/sgen/sgen-marksweep-scan-object-concurrent.h +++ b/mono/sgen/sgen-marksweep-scan-object-concurrent.h @@ -19,8 +19,6 @@ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -extern guint64 stat_scan_object_called_major; - /* * FIXME: We use the same scanning function in the concurrent collector whether we scan * during the starting/finishing collection pause (with the world stopped) or from the @@ -33,60 +31,18 @@ extern guint64 stat_scan_object_called_major; */ #undef HANDLE_PTR -#define HANDLE_PTR(ptr,obj) do { \ - GCObject *__old = *(ptr); \ - SGEN_OBJECT_LAYOUT_STATISTICS_MARK_BITMAP ((obj), (ptr)); \ - binary_protocol_scan_process_reference ((obj), (ptr), __old); \ - if (__old && !sgen_ptr_in_nursery (__old)) { \ - PREFETCH_READ (__old); \ - major_copy_or_mark_object_concurrent ((ptr), __old, queue); \ - } else { \ - if (G_UNLIKELY (sgen_ptr_in_nursery (__old) && !sgen_ptr_in_nursery ((ptr)))) \ - ADD_TO_GLOBAL_REMSET ((full_object), (ptr), __old); \ - } \ - } while (0) - -/* FIXME: Unify this with optimized code in sgen-marksweep.c. */ - -#undef ADD_TO_GLOBAL_REMSET -#define ADD_TO_GLOBAL_REMSET(object,ptr,target) mark_mod_union_card ((object), (void**)(ptr)) - -static void -major_scan_object_no_mark_concurrent_anywhere (GCObject *full_object, SgenDescriptor desc, SgenGrayQueue *queue) -{ - char *start = (char*)full_object; - - SGEN_OBJECT_LAYOUT_STATISTICS_DECLARE_BITMAP; - -#ifdef HEAVY_STATISTICS - sgen_descriptor_count_scanned_object (desc); -#endif -#ifdef SGEN_HEAVY_BINARY_PROTOCOL - add_scanned_object (start); -#endif - -#define SCAN_OBJECT_PROTOCOL -#include "sgen-scan-object.h" - - SGEN_OBJECT_LAYOUT_STATISTICS_COMMIT_BITMAP; - HEAVY_STAT (++stat_scan_object_called_major); -} - -static void -major_scan_object_no_mark_concurrent_start (GCObject *start, SgenDescriptor desc, SgenGrayQueue *queue) -{ - major_scan_object_no_mark_concurrent_anywhere (start, desc, queue); -} - -static void -major_scan_object_no_mark_concurrent (GCObject *start, SgenDescriptor desc, SgenGrayQueue *queue) -{ - SGEN_ASSERT (0, !sgen_ptr_in_nursery (start), "Why are we scanning nursery objects in the concurrent collector?"); - major_scan_object_no_mark_concurrent_anywhere (start, desc, queue); -} +#define HANDLE_PTR(ptr,obj) do { \ + void *__old = *(ptr); \ + binary_protocol_scan_process_reference ((obj), (ptr), __old); \ + if (__old) { \ + gboolean __still_in_nursery = major_copy_or_mark_object_no_evacuation ((ptr), __old, queue); \ + if (G_UNLIKELY (__still_in_nursery && !sgen_ptr_in_nursery ((ptr)) && !SGEN_OBJECT_IS_CEMENTED (*(ptr)))) { \ + void *__copy = *(ptr); \ + sgen_add_to_global_remset ((ptr), __copy); \ + } \ + } \ + } while (0) -#undef ADD_TO_GLOBAL_REMSET -#define ADD_TO_GLOBAL_REMSET(object,ptr,target) sgen_add_to_global_remset ((ptr), (target)) static void major_scan_vtype_concurrent_finish (GCObject *full_object, char *start, SgenDescriptor desc, SgenGrayQueue *queue BINARY_PROTOCOL_ARG (size_t size))