X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fsgen%2Fsgen-marksweep-drain-gray-stack.h;h=fc2161e7d3ec9583b1a72c5ae37515da335e4bcf;hb=6af870bde0bf6a597b4291edb16c4c6b296bc69f;hp=bfddff0d891dcfd36a2c1fb05e0f7c1a11ee6571;hpb=e314e599917a49d4d575a47191c7ef75b5c0cdde;p=mono.git diff --git a/mono/sgen/sgen-marksweep-drain-gray-stack.h b/mono/sgen/sgen-marksweep-drain-gray-stack.h index bfddff0d891..fc2161e7d3e 100644 --- a/mono/sgen/sgen-marksweep-drain-gray-stack.h +++ b/mono/sgen/sgen-marksweep-drain-gray-stack.h @@ -52,12 +52,12 @@ COPY_OR_MARK_FUNCTION_NAME (GCObject **ptr, GCObject *obj, SgenGrayQueue *queue) #endif SGEN_ASSERT (9, obj, "null object from pointer %p", ptr); -#ifndef COPY_OR_MARK_CONCURRENT +#if !defined(COPY_OR_MARK_CONCURRENT) && !defined(COPY_OR_MARK_CONCURRENT_WITH_EVACUATION) SGEN_ASSERT (9, current_collection_generation == GENERATION_OLD, "old gen parallel allocator called from a %d collection", current_collection_generation); #endif if (sgen_ptr_in_nursery (obj)) { -#ifndef COPY_OR_MARK_CONCURRENT +#if !defined(COPY_OR_MARK_CONCURRENT) && !defined(COPY_OR_MARK_CONCURRENT_WITH_EVACUATION) int word, bit; GCObject *forwarded, *old_obj; mword vtable_word = *(mword*)obj; @@ -74,7 +74,7 @@ COPY_OR_MARK_FUNCTION_NAME (GCObject **ptr, GCObject *obj, SgenGrayQueue *queue) HEAVY_STAT (++stat_optimized_copy_nursery_pinned); return TRUE; } - if ((forwarded = SGEN_VTABLE_IS_FORWARDED (vtable_word))) { + if ((forwarded = (GCObject *)SGEN_VTABLE_IS_FORWARDED (vtable_word))) { HEAVY_STAT (++stat_optimized_copy_nursery_forwarded); SGEN_UPDATE_REFERENCE (ptr, forwarded); return sgen_ptr_in_nursery (forwarded); @@ -142,7 +142,7 @@ COPY_OR_MARK_FUNCTION_NAME (GCObject **ptr, GCObject *obj, SgenGrayQueue *queue) #ifdef COPY_OR_MARK_WITH_EVACUATION { GCObject *forwarded; - if ((forwarded = SGEN_VTABLE_IS_FORWARDED (vtable_word))) { + if ((forwarded = (GCObject *)SGEN_VTABLE_IS_FORWARDED (vtable_word))) { HEAVY_STAT (++stat_optimized_copy_major_forwarded); SGEN_UPDATE_REFERENCE (ptr, forwarded); SGEN_ASSERT (9, !sgen_ptr_in_nursery (forwarded), "Cannot be forwarded to nursery."); @@ -166,7 +166,7 @@ COPY_OR_MARK_FUNCTION_NAME (GCObject **ptr, GCObject *obj, SgenGrayQueue *queue) block = MS_BLOCK_FOR_OBJ (obj); -#ifdef COPY_OR_MARK_CONCURRENT +#ifdef COPY_OR_MARK_CONCURRENT_WITH_EVACUATION if (G_UNLIKELY (major_block_is_evacuating (block))) { /* * We don't copy within the concurrent phase. These objects will @@ -220,15 +220,14 @@ SCAN_OBJECT_FUNCTION_NAME (GCObject *full_object, SgenDescriptor desc, SgenGrayQ /* Now scan the object. */ #undef HANDLE_PTR -#ifdef COPY_OR_MARK_CONCURRENT +#if defined(COPY_OR_MARK_CONCURRENT_WITH_EVACUATION) #define HANDLE_PTR(ptr,obj) do { \ GCObject *__old = *(ptr); \ binary_protocol_scan_process_reference ((full_object), (ptr), __old); \ if (__old && !sgen_ptr_in_nursery (__old)) { \ - MSBlockInfo *block = MS_BLOCK_FOR_OBJ (__old); \ if (G_UNLIKELY (!sgen_ptr_in_nursery (ptr) && \ sgen_safe_object_is_small (__old, sgen_obj_get_descriptor (__old) & DESC_TYPE_MASK) && \ - major_block_is_evacuating (block))) { \ + major_block_is_evacuating (MS_BLOCK_FOR_OBJ (__old)))) { \ mark_mod_union_card ((full_object), (void**)(ptr), __old); \ } else { \ PREFETCH_READ (__old); \ @@ -239,14 +238,26 @@ SCAN_OBJECT_FUNCTION_NAME (GCObject *full_object, SgenDescriptor desc, SgenGrayQ mark_mod_union_card ((full_object), (void**)(ptr), __old); \ } \ } while (0) +#elif defined(COPY_OR_MARK_CONCURRENT) +#define HANDLE_PTR(ptr,obj) do { \ + GCObject *__old = *(ptr); \ + binary_protocol_scan_process_reference ((full_object), (ptr), __old); \ + if (__old && !sgen_ptr_in_nursery (__old)) { \ + PREFETCH_READ (__old); \ + COPY_OR_MARK_FUNCTION_NAME ((ptr), __old, queue); \ + } else { \ + if (G_UNLIKELY (sgen_ptr_in_nursery (__old) && !sgen_ptr_in_nursery ((ptr)))) \ + mark_mod_union_card ((full_object), (void**)(ptr), __old); \ + } \ + } while (0) #else #define HANDLE_PTR(ptr,obj) do { \ - void *__old = *(ptr); \ + GCObject *__old = *(ptr); \ binary_protocol_scan_process_reference ((full_object), (ptr), __old); \ if (__old) { \ gboolean __still_in_nursery = COPY_OR_MARK_FUNCTION_NAME ((ptr), __old, queue); \ if (G_UNLIKELY (__still_in_nursery && !sgen_ptr_in_nursery ((ptr)) && !SGEN_OBJECT_IS_CEMENTED (*(ptr)))) { \ - void *__copy = *(ptr); \ + GCObject *__copy = *(ptr); \ sgen_add_to_global_remset ((ptr), __copy); \ } \ } \ @@ -260,7 +271,7 @@ SCAN_OBJECT_FUNCTION_NAME (GCObject *full_object, SgenDescriptor desc, SgenGrayQ static gboolean DRAIN_GRAY_STACK_FUNCTION_NAME (SgenGrayQueue *queue) { -#ifdef COPY_OR_MARK_CONCURRENT +#if defined(COPY_OR_MARK_CONCURRENT) || defined(COPY_OR_MARK_CONCURRENT_WITH_EVACUATION) int i; for (i = 0; i < 32; i++) { #else