X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fsgen-major-scan-object.h;h=a4674a2139d4c7180b260fc8b9eac8c9799cd121;hb=4d958ad0a007610936fe0b162f1f0afdcf179d30;hp=6b658058db581c0589460f58e715cd5b3b1048c1;hpb=982cc370d854ba93e265b156a0ffdd98b760d7b0;p=mono.git diff --git a/mono/metadata/sgen-major-scan-object.h b/mono/metadata/sgen-major-scan-object.h index 6b658058db5..a4674a2139d 100644 --- a/mono/metadata/sgen-major-scan-object.h +++ b/mono/metadata/sgen-major-scan-object.h @@ -27,25 +27,28 @@ extern long long stat_scan_object_called_major; #define PREFETCH_DYNAMIC_HEAP(addr) PREFETCH ((addr)) #endif -#ifdef SGEN_CONCURRENT_MARK +#ifdef SCAN_FOR_CONCURRENT_MARK #define FOLLOW_OBJECT(addr) (!sgen_ptr_in_nursery ((addr))) #define ALWAYS_ADD_TO_GLOBAL_REMSET 1 +#define CONCURRENT_NAME(x) x ## _concurrent #else #define FOLLOW_OBJECT(addr) 1 #define ALWAYS_ADD_TO_GLOBAL_REMSET 0 +#define CONCURRENT_NAME(x) x #endif #undef HANDLE_PTR #define HANDLE_PTR(ptr,obj) do { \ void *__old = *(ptr); \ void *__copy; \ + SGEN_OBJECT_LAYOUT_STATISTICS_MARK_BITMAP ((obj), (ptr)); \ if (__old && FOLLOW_OBJECT (__old)) { \ PREFETCH_DYNAMIC_HEAP (__old); \ - major_copy_or_mark_object ((ptr), __old, queue); \ + CONCURRENT_NAME (major_copy_or_mark_object) ((ptr), __old, queue); \ __copy = *(ptr); \ SGEN_COND_LOG (9, __old != __copy, "Overwrote field at %p with %p (was: %p)", (ptr), *(ptr), __old); \ if (G_UNLIKELY (sgen_ptr_in_nursery (__copy) && !sgen_ptr_in_nursery ((ptr)))) \ - sgen_add_to_global_remset ((ptr), __copy); \ + sgen_add_to_global_remset ((ptr), __copy); \ } else { \ if (ALWAYS_ADD_TO_GLOBAL_REMSET && G_UNLIKELY (sgen_ptr_in_nursery (__old) && !sgen_ptr_in_nursery ((ptr)))) \ sgen_add_to_global_remset ((ptr), __old); \ @@ -53,25 +56,39 @@ extern long long stat_scan_object_called_major; } while (0) static void -major_scan_object (char *start, SgenGrayQueue *queue) +CONCURRENT_NAME (major_scan_object) (char *start, SgenGrayQueue *queue) { + SGEN_OBJECT_LAYOUT_STATISTICS_DECLARE_BITMAP; + +#define SCAN_OBJECT_PROTOCOL #include "sgen-scan-object.h" + SGEN_OBJECT_LAYOUT_STATISTICS_COMMIT_BITMAP; HEAVY_STAT (++stat_scan_object_called_major); } -#ifdef SGEN_CONCURRENT_MARK +#ifdef SCAN_FOR_CONCURRENT_MARK #ifdef SGEN_PARALLEL_MARK #error concurrent and parallel mark not supported yet #else static void -major_scan_vtype (char *start, mword desc, SgenGrayQueue *queue) +CONCURRENT_NAME (major_scan_vtype) (char *start, mword desc, SgenGrayQueue *queue BINARY_PROTOCOL_ARG (size_t size)) { + SGEN_OBJECT_LAYOUT_STATISTICS_DECLARE_BITMAP; + /* The descriptors include info about the MonoObject header as well */ start -= sizeof (MonoObject); #define SCAN_OBJECT_NOVTABLE +#define SCAN_OBJECT_PROTOCOL #include "sgen-scan-object.h" + + SGEN_OBJECT_LAYOUT_STATISTICS_COMMIT_BITMAP; } #endif #endif + +#undef PREFETCH_DYNAMIC_HEAP +#undef FOLLOW_OBJECT +#undef ALWAYS_ADD_TO_GLOBAL_REMSET +#undef CONCURRENT_NAME