#ifdef HEAVY_STATISTICS
++stat_optimized_copy;
{
- char *forwarded;
+ GCObject *forwarded;
SgenDescriptor desc;
if ((forwarded = SGEN_OBJECT_IS_FORWARDED (obj)))
desc = sgen_obj_get_descriptor_safe (forwarded);
#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;
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);
#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.");
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
/* 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 ((obj), (ptr), __old); \
+ 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))) { \
- mark_mod_union_card ((full_object), (void**)(ptr)); \
+ major_block_is_evacuating (MS_BLOCK_FOR_OBJ (__old)))) { \
+ mark_mod_union_card ((full_object), (void**)(ptr), __old); \
} else { \
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)); \
+ 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); \
- binary_protocol_scan_process_reference ((obj), (ptr), __old); \
+ 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); \
} \
} \
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