[sgen] Make enqueuing descriptors compile-time optional.
authorMark Probst <mark.probst@gmail.com>
Fri, 29 Aug 2014 00:22:50 +0000 (17:22 -0700)
committerMark Probst <mark.probst@gmail.com>
Wed, 26 Nov 2014 18:38:35 +0000 (10:38 -0800)
We want to test this in combination with other changes, so we make
each of them configurable.

mono/metadata/sgen-gc.c
mono/metadata/sgen-gray.c
mono/metadata/sgen-gray.h
mono/metadata/sgen-marksweep.c

index 30528f4264023081a8d8609bf9dda6bd4c3e19bf..f5e89d77b50b016f297414954e33c2d28cf98b05 100644 (file)
@@ -900,6 +900,9 @@ sgen_drain_gray_stack (int max_objs, ScanCopyContext ctx)
                        if (!obj)
                                return TRUE;
                        SGEN_LOG (9, "Precise gray object scan %p (%s)", obj, safe_name (obj));
+#ifndef SGEN_GRAY_QUEUE_HAVE_DESCRIPTORS
+                       desc = sgen_obj_get_descriptor_safe (obj);
+#endif
                        scan_func (obj, desc, queue);
                }
        } while (max_objs < 0);
index 048d623fe5e2d10c638433cdb748a74dc6f11257..bd494b62e140d9eac28dfba8bdeb430076008199 100644 (file)
@@ -99,7 +99,7 @@ sgen_gray_object_free_queue_section (GrayQueueSection *section)
 void
 sgen_gray_object_enqueue (SgenGrayQueue *queue, char *obj, mword desc)
 {
-       GrayQueueEntry entry = { obj, desc };
+       GrayQueueEntry entry = SGEN_GRAY_QUEUE_ENTRY (obj, desc);
 
        HEAVY_STAT (stat_gray_queue_enqueue_slow_path ++);
 
@@ -385,7 +385,11 @@ sgen_gray_object_fill_prefetch (SgenGrayQueue *queue)
                ++from;
        }
        while (to < end) {
+#ifdef SGEN_GRAY_QUEUE_HAVE_DESCRIPTORS
                GRAY_OBJECT_DEQUEUE (queue, &to->obj, &to->desc);
+#else
+               GRAY_OBJECT_DEQUEUE (queue, &to->obj, NULL);
+#endif
                /* This doesn't necessarily matter because this function constitutes the slow path. */
                PREFETCH (to->obj);
                ++to;
index 536bf673568c987aad790d8fea9a7021ee831964..42c3b54fdcef7b8c37de8d7bcc5fe85b37458a1d 100644 (file)
@@ -68,12 +68,22 @@ typedef enum {
 } GrayQueueSectionState;
 #endif
 
+#define SGEN_GRAY_QUEUE_HAVE_DESCRIPTORS
+
 typedef struct _GrayQueueEntry GrayQueueEntry;
 struct _GrayQueueEntry {
        char *obj;
+#ifdef SGEN_GRAY_QUEUE_HAVE_DESCRIPTORS
        mword desc;
+#endif
 };
 
+#ifdef SGEN_GRAY_QUEUE_HAVE_DESCRIPTORS
+#define SGEN_GRAY_QUEUE_ENTRY(obj,desc)        { (obj), (desc) }
+#else
+#define SGEN_GRAY_QUEUE_ENTRY(obj,desc) { (obj) }
+#endif
+
 /*
  * This is a stack now instead of a queue, so the most recently added items are removed
  * first, improving cache locality, and keeping the stack size manageable.
@@ -176,7 +186,7 @@ GRAY_OBJECT_ENQUEUE (SgenGrayQueue *queue, char* obj, mword desc)
        if (G_UNLIKELY (!queue->first || queue->cursor == GRAY_LAST_CURSOR_POSITION (queue->first))) {
                sgen_gray_object_enqueue (queue, obj, desc);
        } else {
-               GrayQueueEntry entry = { obj, desc };
+               GrayQueueEntry entry = SGEN_GRAY_QUEUE_ENTRY (obj, desc);
 
                HEAVY_STAT (stat_gray_queue_enqueue_fast_path ++);
 
@@ -195,7 +205,9 @@ GRAY_OBJECT_DEQUEUE (SgenGrayQueue *queue, char** obj, mword *desc)
 #if SGEN_MAX_DEBUG_LEVEL >= 9
        entry = sgen_gray_object_enqueue (queue);
        *obj = entry.obj;
+#ifdef SGEN_GRAY_QUEUE_HAVE_DESCRIPTORS
        *desc = entry.desc;
+#endif
 #else
        if (!queue->first) {
                HEAVY_STAT (stat_gray_queue_dequeue_fast_path ++);
@@ -207,13 +219,17 @@ GRAY_OBJECT_DEQUEUE (SgenGrayQueue *queue, char** obj, mword *desc)
        } else if (G_UNLIKELY (queue->cursor == GRAY_FIRST_CURSOR_POSITION (queue->first))) {
                entry = sgen_gray_object_dequeue (queue);
                *obj = entry.obj;
+#ifdef SGEN_GRAY_QUEUE_HAVE_DESCRIPTORS
                *desc = entry.desc;
+#endif
        } else {
                HEAVY_STAT (stat_gray_queue_dequeue_fast_path ++);
 
                entry = *queue->cursor--;
                *obj = entry.obj;
+#ifdef SGEN_GRAY_QUEUE_HAVE_DESCRIPTORS
                *desc = entry.desc;
+#endif
 #ifdef SGEN_HEAVY_BINARY_PROTOCOL
                binary_protocol_gray_dequeue (queue, queue->cursor + 1, *obj);
 #endif
@@ -226,8 +242,12 @@ sgen_gray_object_dequeue_fast (SgenGrayQueue *queue, char** obj, mword *desc) {
        GrayQueueEntry *cursor = queue->prefetch_cursor;
        GrayQueueEntry *const end = queue->prefetch + SGEN_GRAY_QUEUE_PREFETCH_SIZE;
        *obj = cursor->obj;
+#ifdef SGEN_GRAY_QUEUE_HAVE_DESCRIPTORS
        *desc = cursor->desc;
        GRAY_OBJECT_DEQUEUE (queue, &cursor->obj, &cursor->desc);
+#else
+       GRAY_OBJECT_DEQUEUE (queue, &cursor->obj, NULL);
+#endif
        PREFETCH (cursor->obj);
        ++cursor;
        if (cursor == end)
index 620c1332e16ece1f819a216122ddd650664db234..464adac56f4f6c90e653f245350dfd52a2e3a2a5 100644 (file)
@@ -1216,6 +1216,9 @@ drain_gray_stack (ScanCopyContext ctx)
                        return TRUE;
 #endif
 
+#ifndef SGEN_GRAY_QUEUE_HAVE_DESCRIPTORS
+               desc = sgen_obj_get_descriptor_safe (obj);
+#endif
 #ifdef HEAVY_STATISTICS
                sgen_descriptor_count_scanned_object (desc);
 #endif