Merge pull request #1780 from alexrp/master
[mono.git] / mono / metadata / sgen-toggleref.c
index 75932c300fc4770649201f03ec20b711c1ac6f84..94c11ddc0b612a5056ccb7ee5e74067930157885 100644 (file)
@@ -25,8 +25,9 @@
 
 #ifdef HAVE_SGEN_GC
 
-#include "sgen-gc.h"
+#include "sgen/sgen-gc.h"
 #include "sgen-toggleref.h"
+#include "sgen/sgen-client.h"
 
 
 /*only one of the two can be non null at a given time*/
@@ -90,14 +91,13 @@ sgen_process_togglerefs (void)
                w);
 }
 
-void
-sgen_scan_togglerefs (char *start, char *end, ScanCopyContext ctx)
+void sgen_client_mark_togglerefs (char *start, char *end, ScanCopyContext ctx)
 {
-       CopyOrMarkObjectFunc copy_func = ctx.copy_func;
+       CopyOrMarkObjectFunc copy_func = ctx.ops->copy_or_mark_object;
        SgenGrayQueue *queue = ctx.queue;
        int i;
 
-       SGEN_LOG (4, "Scanning ToggleRefs %d", toggleref_array_size);
+       SGEN_LOG (4, "Marking ToggleRefs %d", toggleref_array_size);
 
        for (i = 0; i < toggleref_array_size; ++i) {
                if (toggleref_array [i].strong_ref) {
@@ -106,7 +106,21 @@ sgen_scan_togglerefs (char *start, char *end, ScanCopyContext ctx)
                                SGEN_LOG (6, "\tcopying strong slot %d", i);
                                copy_func (&toggleref_array [i].strong_ref, queue);
                        }
-               } else if (toggleref_array [i].weak_ref) {
+               }
+       }
+       sgen_drain_gray_stack (-1, ctx);
+}
+
+void sgen_client_clear_togglerefs (char *start, char *end, ScanCopyContext ctx)
+{
+       CopyOrMarkObjectFunc copy_func = ctx.ops->copy_or_mark_object;
+       SgenGrayQueue *queue = ctx.queue;
+       int i;
+
+       SGEN_LOG (4, "Clearing ToggleRefs %d", toggleref_array_size);
+
+       for (i = 0; i < toggleref_array_size; ++i) {
+               if (toggleref_array [i].weak_ref) {
                        char *object = toggleref_array [i].weak_ref;
 
                        if (object >= start && object < end) {
@@ -120,6 +134,7 @@ sgen_scan_togglerefs (char *start, char *end, ScanCopyContext ctx)
                        }
                }
        }
+       sgen_drain_gray_stack (-1, ctx);
 }
 
 static void