/* Returns whether the object is still in the nursery. */
static inline MONO_ALWAYS_INLINE gboolean
-COPY_OR_MARK_FUNCTION_NAME (void **ptr, void *obj, SgenGrayQueue *queue)
+COPY_OR_MARK_FUNCTION_NAME (GCObject **ptr, GCObject *obj, SgenGrayQueue *queue)
{
MSBlockInfo *block;
++stat_optimized_copy;
{
char *forwarded;
- mword desc;
+ SgenDescriptor desc;
if ((forwarded = SGEN_OBJECT_IS_FORWARDED (obj)))
desc = sgen_obj_get_descriptor_safe (forwarded);
else
#endif
SGEN_ASSERT (9, obj, "null object from pointer %p", ptr);
+#ifndef COPY_OR_MARK_CONCURRENT
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
int word, bit;
- char *forwarded, *old_obj;
+ GCObject *forwarded, *old_obj;
mword vtable_word = *(mword*)obj;
HEAVY_STAT (++stat_optimized_copy_nursery);
MS_CALC_MARK_BIT (word, bit, obj);
SGEN_ASSERT (9, !MS_MARK_BIT (block, word, bit), "object %p already marked", obj);
MS_SET_MARK_BIT (block, word, bit);
- binary_protocol_mark (obj, (gpointer)LOAD_VTABLE (obj), sgen_safe_object_get_size ((GCObject*)obj));
+ binary_protocol_mark (obj, (gpointer)LOAD_VTABLE (obj), sgen_safe_object_get_size (obj));
return FALSE;
+#endif
} else {
mword vtable_word = *(mword*)obj;
- mword desc;
+ SgenDescriptor desc;
int type;
HEAVY_STAT (++stat_optimized_copy_major);
#ifdef COPY_OR_MARK_WITH_EVACUATION
{
- char *forwarded;
+ GCObject *forwarded;
if ((forwarded = SGEN_VTABLE_IS_FORWARDED (vtable_word))) {
HEAVY_STAT (++stat_optimized_copy_major_forwarded);
SGEN_UPDATE_REFERENCE (ptr, forwarded);
SGEN_ASSERT (9, !SGEN_VTABLE_IS_PINNED (vtable_word), "Pinned object in non-pinned block?");
- desc = sgen_vtable_get_descriptor ((GCVTable*)vtable_word);
+ desc = sgen_vtable_get_descriptor ((GCVTable)vtable_word);
type = desc & DESC_TYPE_MASK;
- if (sgen_safe_object_is_small ((GCObject*)obj, type)) {
+ if (sgen_safe_object_is_small (obj, type)) {
#ifdef HEAVY_STATISTICS
if (type <= DESC_TYPE_MAX_SMALL_OBJ)
++stat_optimized_copy_major_small_fast;
if (sgen_los_object_is_pinned (obj))
return FALSE;
- binary_protocol_pin (obj, (gpointer)SGEN_LOAD_VTABLE (obj), sgen_safe_object_get_size ((GCObject*)obj));
+ binary_protocol_pin (obj, (gpointer)SGEN_LOAD_VTABLE (obj), sgen_safe_object_get_size (obj));
sgen_los_pin_object (obj);
if (SGEN_OBJECT_HAS_REFERENCES (obj))
}
return FALSE;
}
- SGEN_ASSERT (0, FALSE, "How is this happening?");
- return FALSE;
+
+ return TRUE;
}
static void
-SCAN_OBJECT_FUNCTION_NAME (char *obj, mword desc, SgenGrayQueue *queue)
+SCAN_OBJECT_FUNCTION_NAME (GCObject *full_object, SgenDescriptor desc, SgenGrayQueue *queue)
{
- char *start = obj;
+ char *start = (char*)full_object;
#ifdef HEAVY_STATISTICS
++stat_optimized_major_scan;
/* Now scan the object. */
#undef HANDLE_PTR
+#ifdef COPY_OR_MARK_CONCURRENT
+#define HANDLE_PTR(ptr,obj) do { \
+ GCObject *__old = *(ptr); \
+ binary_protocol_scan_process_reference ((obj), (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)); \
+ } \
+ } while (0)
+#else
#define HANDLE_PTR(ptr,obj) do { \
void *__old = *(ptr); \
binary_protocol_scan_process_reference ((obj), (ptr), __old); \
} \
} \
} while (0)
+#endif
#define SCAN_OBJECT_PROTOCOL
#include "sgen-scan-object.h"
}
static gboolean
-DRAIN_GRAY_STACK_FUNCTION_NAME (ScanCopyContext ctx)
+DRAIN_GRAY_STACK_FUNCTION_NAME (SgenGrayQueue *queue)
{
- SgenGrayQueue *queue = ctx.queue;
-
- SGEN_ASSERT (0, ctx.ops->scan_object == major_scan_object_with_evacuation, "Wrong scan function");
-
+#ifdef COPY_OR_MARK_CONCURRENT
+ int i;
+ for (i = 0; i < 32; i++) {
+#else
for (;;) {
- char *obj;
- mword desc;
+#endif
+ GCObject *obj;
+ SgenDescriptor desc;
HEAVY_STAT (++stat_drain_loops);
if (!obj)
return TRUE;
- SCAN_OBJECT_FUNCTION_NAME (obj, desc, ctx.queue);
+ SCAN_OBJECT_FUNCTION_NAME (obj, desc, queue);
}
+ return FALSE;
}
#undef COPY_OR_MARK_FUNCTION_NAME