[utils] Move mutex and semaphore to mono_os_*
[mono.git] / mono / sgen / sgen-marksweep-drain-gray-stack.h
index ebfb2507cb831d2ea523e1b7a83873791fb11707..dce3be7344ad528c712be144fd775d38becfa295 100644 (file)
@@ -33,7 +33,7 @@
 
 /* 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;
 
@@ -41,7 +41,7 @@ COPY_OR_MARK_FUNCTION_NAME (void **ptr, void *obj, SgenGrayQueue *queue)
        ++stat_optimized_copy;
        {
                char *forwarded;
-               mword desc;
+               SgenDescriptor desc;
                if ((forwarded = SGEN_OBJECT_IS_FORWARDED (obj)))
                        desc = sgen_obj_get_descriptor_safe (forwarded);
                else
@@ -52,11 +52,14 @@ COPY_OR_MARK_FUNCTION_NAME (void **ptr, void *obj, SgenGrayQueue *queue)
 #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);
@@ -125,19 +128,20 @@ COPY_OR_MARK_FUNCTION_NAME (void **ptr, void *obj, SgenGrayQueue *queue)
                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);
@@ -149,10 +153,10 @@ COPY_OR_MARK_FUNCTION_NAME (void **ptr, void *obj, SgenGrayQueue *queue)
 
                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;
@@ -181,7 +185,7 @@ COPY_OR_MARK_FUNCTION_NAME (void **ptr, void *obj, SgenGrayQueue *queue)
 
                        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))
@@ -189,14 +193,14 @@ COPY_OR_MARK_FUNCTION_NAME (void **ptr, void *obj, SgenGrayQueue *queue)
                }
                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;
@@ -211,6 +215,19 @@ SCAN_OBJECT_FUNCTION_NAME (char *obj, mword desc, SgenGrayQueue *queue)
        /* 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); \
@@ -222,21 +239,23 @@ SCAN_OBJECT_FUNCTION_NAME (char *obj, mword desc, SgenGrayQueue *queue)
                        }                                               \
                }                                                       \
        } 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);
 
@@ -244,8 +263,9 @@ DRAIN_GRAY_STACK_FUNCTION_NAME (ScanCopyContext ctx)
                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